跳到主要内容

简述 SQLAchemy 中如何设置联合唯一索引?

参考答案:

在SQLAlchemy中,你可以使用UniqueConstraint来设置联合唯一索引。以下是一个简单的例子:

from sqlalchemy import create_engine, Column, Integer, String, UniqueConstraint, MetaData, Table

metadata = MetaData()

users = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('email', String),
    UniqueConstraint('name', 'email', name='uq_name_email')
)

engine = create_engine('sqlite:///example.db')

metadata.create_all(engine)

在这个例子中,我们创建了一个名为users的表,其中nameemail列有一个联合唯一约束。这意味着在表中,任何两行都不能有相同的nameemail组合。

UniqueConstraint的第一个和第二个参数是要包含在联合唯一约束中的列的名称,name参数是这个约束的名称。

metadata.create_all(engine)语句将创建表并将联合唯一约束添加到数据库中。

注意,联合唯一索引和联合唯一约束在SQLAlchemy中有所不同。联合唯一索引主要用于优化查询性能,而联合唯一约束则用于保证数据的完整性。在上述例子中,我们实际上创建的是一个联合唯一约束,而不是一个联合唯一索引。如果你需要创建一个联合唯一索引,可以使用Index类,如下所示:

from sqlalchemy import create_engine, Column, Integer, String, Index, MetaData, Table

metadata = MetaData()

users = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('email', String),
    UniqueConstraint('name', 'email', name='uq_name_email')
)

# 创建联合唯一索引
index_name = Index('ix_name_email', users.c, users.c.name, users.c.email, unique=True)

engine = create_engine('sqlite:///example.db')

metadata.create_all(engine)
index_name.create(engine)

在这个例子中,我们首先创建了一个联合唯一约束,然后创建了一个名为ix_name_email的联合唯一索引,该索引包含nameemail列,并设置为唯一。最后,我们使用index_name.create(engine)语句将索引添加到数据库中。