如何不修改数据库获取SQLAlchemy按MetaData规则生成的约束默认名称
原因说明
SQLAlchemy的MetaData命名约定默认不会在你调用append_constraint时就主动计算并填充约束的name字段,命名计算逻辑默认延迟到DDL(数据定义语言)语句生成阶段才会触发,所以你直接读取constraint.name会得到None。
解决方法
方案1:主动触发约束的父类绑定逻辑(兼容SQLAlchemy 1.x、2.x版本)
你可以手动调用约束的_set_parent方法,这个方法会执行命名规则的计算逻辑,直接填充name字段,修改后的示例代码如下:
from sqlalchemy import MetaData, Table, Column, Integer, UniqueConstraint naming_convention = { "uq": '%(table_name)s_%(column_0_name)s_uq' } metadata = MetaData(naming_convention = naming_convention) table = Table("table1", metadata, Column('col1', Integer)) constraint = UniqueConstraint('col1', name = None) table.append_constraint(constraint) # 新增:主动触发命名计算 constraint._set_parent(table) default_constraint_name = constraint.name print(default_constraint_name) # 输出:table1_col1_uq
注意你原示例中的预期值table1_col1s_uq多写了一个s,按照你定义的命名规则,正确生成的名称为table1_col1_uq。
方案2:不依赖私有方法的通用实现
如果你不想调用以下划线开头的私有方法,可以通过构造DDL编译的方式获取生成的约束名称:
from sqlalchemy.schema import CreateTable # 沿用上面已定义好的table、constraint对象 create_ddl = CreateTable(table) compiled_ddl = create_ddl.compile() # 编译完成后约束的name会自动填充 default_constraint_name = constraint.name
注意事项
如果你后续需要修改约束关联的列或者表属性,需要重新触发一次命名计算,才能得到更新后的约束名称。
内容的提问来源于stack exchange,提问作者Dominykas Mostauskis
相关产品推荐
相关产品推荐

