Python自動化開發學習12-聯合唯一
阿新 • • 發佈:2018-01-26
必須 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-聯合唯一