1. 程式人生 > >Python自動化開發學習12-聯合唯一

Python自動化開發學習12-聯合唯一

必須 index ext 建表 uniq mar auto int 修改表結構

聯合唯一

聯合唯一,就是一個表中的多個字段的組合需要唯一。

使用mysql語句創建

比如創建一張hosts表,記錄登錄的ip地址或者hostname(表中對應字段host)和 端口號(表中對應字段port),要求host 和 port 的組合必須唯一:

> CREATE TABLE hosts1 (
    -> id INT UNSIGNED AUTO_INCREMENT,
    -> host CHAR(20) NOT NULL,
    -> port TINYINT UNSIGNED DEFAULT 22,
    -> description VARCHAR(20),
    -> PRIMARY KEY (id)
    -> );

如果表已經存在,那麽需要修改表結構,增加唯一約束:

> ALTER TABLE hosts1
    -> ADD UNIQUE KEY host_port(host, port)

或者直接一步到位,創建表的時候指定唯一約束:

> CREATE TABLE hosts2 (
    -> id INT UNSIGNED AUTO_INCREMENT,
    -> host CHAR(20) NOT NULL,
    -> port TINYINT UNSIGNED DEFAULT 22,
    -> description VARCHAR(20),
    -> PRIMARY KEY (id),
    -> UNIQUE KEY host_port(host, port)
    -> );

使用SQLAlchemy操作

聯合唯一需要導入額外的模塊 UniqueConstraint ,然後用一個變量 __table_args__ 存放你要聲明的聯合唯一。另外如果要聲明索引,也是在這個變量裏。變量的類型是元祖。

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, CHAR
from sqlalchemy.dialects.mysql import INTEGER, TINYINT
from sqlalchemy import UniqueConstraint  # 聯合唯一,需要導入

engine = create_engine("mysql+pymysql://admin:[email protected]/week12",
                       encoding=‘utf-8‘, echo=True)  # 這裏設置了echo參數,顯示中間過程和SQL語句

Base = declarative_base()  # 生成orm基類
class Hosts3(Base):
    __tablename__ = ‘hosts3‘  # 表名
    id = Column(INTEGER(unsigned=True), primary_key=True)
    host = Column(CHAR(20))
    port = Column(TINYINT(unsigned=True), default=22)
    description = Column(String(20))
    __table_args__ = (UniqueConstraint(‘host‘, ‘port‘, name=‘host_port‘),)  # 這個變量名不能變,後面是個元祖
    # 另外如果要做索引,也是寫上面的元祖裏。索引需要導入Index,然後加上這個: Index(‘host‘, ‘port‘)

Base.metadata.create_all(engine)  # 創建表結構,這裏是通過父類來調用子類

Python自動化開發學習12-聯合唯一