gpt4 book ai didi

python - slqlalchemy UniqueConstraint VS 索引(唯一=真)

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:17 28 4
gpt4 key购买 nike

我正在使用 MySQL(运行 InnoDB),并使用 sqlalchemy 包装了整个东西。现在,我想通过使用(参见 docs)在我的数据库中生成更改

sqlalchemy_utils.functions.create_database(...)

通常上面的函数会做它应该做的事情。唯一的异常(exception)是唯一索引的生成。

比如说,我定义了一个这样的表:

## ...
# DeclBase = declarative_base()
## ...
class MyTable(DeclBase):
__tablename__ = 'my_table'

id = Column(Integer, primary_key=True)
attr_1 = Column(String(32))
attr_2 = Column(Integer, nullable=False)
attr_3 = Column(DateTime)
attr_4 = Column(
Integer,
ForeignKey('other_table.id', onupdate='CASCADE', ondelete='CASCADE'),
nullable=False
)

u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx')

当我调用 create_database 时,我将让 sqlalchemy 使用指定的所有列创建表“my_table”。外键也设置好了,但是在数据库端找不到唯一索引。然后我尝试使用 Index(unique=True) 代替。所以不是

u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx')

我放

u_idx_1 = Index('my_table_uidx', attr_2, attr_3, unique=True)

我的印象是这在逻辑上会产生类似的结果。这次 sqlalchemy 确实在数据库上创建了唯一索引。

也许我误解了 UniqueConstraint 和 Index(unique=True) 之间的区别,或者 sqlalchemy 使用它们自动生成数据库的方式。

任何人都可以阐明这一点吗?

最佳答案

主要区别在于 Index API允许在表定义之外定义索引,只要它可以通过传递的 SQL 构造引用表,UniqueConstraint和一般约束must be defined inline in the table definition :

To apply table-level constraint objects such as ForeignKeyConstraint to a table defined using Declarative, use the __table_args__ attribute, described at Table Configuration.

要理解的是,在声明类的构造过程中,如果未传递显式 __table__,则会构造一个新的 Table。在您的示例模型类中, UniqueConstraint 实例绑定(bind)到一个类属性,但声明性基础不包括从属性创建的 Table 实例中的约束。您必须在表参数中传递它:

class MyTable(DeclBase):
__tablename__ = 'my_table'
...
# A positional argument tuple, passed to Table constructor
__table_args__ = (
UniqueConstraint(attr_2, attr_3, name='my_table_uidx'),
)

请注意,您必须将约束名称作为关键字参数传递。您还可以使用 Table.append_constraint() 传递约束,如果在任何尝试创建表之前调用:

class MyTable(DeclBase):
...

MyTable.__table__.append_constraint(
UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx'))

关于python - slqlalchemy UniqueConstraint VS 索引(唯一=真),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43275547/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com