標籤:使用 一個 ext creat from echo 匯入 通過 meta
聯合唯一
聯合唯一,就是一個表中的多個欄位的組合需要唯一。
使用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_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, CHARfrom sqlalchemy.dialects.mysql import INTEGER, TINYINTfrom 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-聯合唯一