SQLAlchemy如何通过变量统一定义同类型列实现配置复用
报错原因
你直接定义的currencyamount是单个固定的Column实例,SQLAlchemy要求每个Column实例只能绑定到一个数据表的唯一字段,将同一个实例重复赋值给多个模型属性时,就会触发Column object already assigned冲突报错。
实现方案
方案1:列工厂函数(推荐,适配字段名不同的场景)
定义一个返回全新Column实例的函数,每次调用都会生成独立的、未绑定的Column对象,完全满足复用配置的需求:
# 定义通用列工厂 def currency_amount_column(*args, **kwargs): # 可预设通用参数,也支持调用时自定义覆盖 kwargs.setdefault("nullable", False) return Column(Numeric(10, 2), *args, **kwargs)
模型中使用方式:
class PurchaseOrder(Model): unitprice = currency_amount_column() # ...其他字段 class SalesOrder(Model): salesprice = currency_amount_column(nullable=True) # ...其他字段
后续如果要调整金额字段的精度、默认参数,仅修改currency_amount_column函数内的定义即可,所有引用位置都会同步生效。
方案2:Mixin抽象类(适配字段名相同的场景)
如果多个模型的公共字段名称也完全一致,可以用Mixin类实现复用:
class CurrencyAmountMixin: amount = Column(Numeric(10, 2), nullable=False) class PurchaseOrder(Model, CurrencyAmountMixin): # 自动继承amount字段 # ...其他特有字段 class SalesOrder(Model, CurrencyAmountMixin): # 自动继承amount字段 # ...其他特有字段
内容的提问来源于stack exchange,提问作者Mark Langenhoven
相关产品推荐
相关产品推荐

