Python自动化开发学习13-联合唯一

本文介绍如何在MySQL中使用联合唯一约束确保表中的多个字段组合唯一,包括创建表时直接定义和后期修改表结构两种方式,并提供了SQLAlchemy实现的示例。

联合唯一

联合唯一,就是一个表中的多个字段的组合需要唯一。

使用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:admin123@192.168.246.12/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)  # 创建表结构,这里是通过父类来调用子类

转载于:https://blog.51cto.com/steed/2065499

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值