sqlalchemy使用变量定义列



假设我有许多模型都使用相同类型的列。例如

class PurchaseOrder(Model):
unitprice = Column(Numeric(10,2))
...other columns
class SalesOrder(Model):
salesprice = Column(Numeric(10,2))
...other columns

我想定义一些变量,如;

currencyamount = Column(Numeric(10,2))

然后,如果定义改变了,我只有一个地方可以修复它。我希望模型定义现在看起来像这样。

class PurchaseOrder(Model):
unitprice = currencyamount
...other columns

如果我尝试这样做,我会得到一个错误的行"列对象'单价'已经分配给表PurchaseOrder.">

我该怎么做呢?

我认为最干净的方法是创建一个抽象的Order基类,其中包含您的通用属性定义,然后为您的不同订单类型创建子类。

SQLAlchemy允许您创建一个不会通过__abstract__指示符在数据库中表示的基类。您可以在该类上定义通用属性。点击这里阅读更多内容

像这样的东西应该为你工作:

class Order(Model):
__abstract__ = True
unitprice = Column(Numeric(10,2))
class PurchaseOrder(Order):
...other columns
class SalesOrder(Order):
...other columns

unitprice列将被两个子类继承。

你的对象在应用程序中是共享的。它是每个类使用的相同引用。也许你应该尝试使用一个工厂方法:

class PurchaseOrder(Model):
unitprice = get_currency_column()
...other columns
get_currency_column():
return Column(Numeric(10,2))

但是,坦率地说,我对列定义如此频繁地更改感到惊讶。

我通常使用一个函数,然后调用它来生成该列。这样做的另一个好处是,您可以添加参数来定制列配置。

def currencyamount_col():
return Column(Numeric(10,2))
#...
class PurchaseOrder(Model):
unitprice = currencyamount_col()
# ...other columns
下面是我使用的一个日期列工厂:

def dt_column(default_now=True, onupdate_now=False, **override_col_kwargs):
dt_kwargs = {
"timezone": True
}
dt = DateTime(**dt_kwargs)
col_kwargs = {}
if default_now:
col_kwargs['default'] = utc_now
if onupdate_now:
col_kwargs['onupdate'] = utc_now
col_kwargs.update(override_col_kwargs)
return Column(dt, **col_kwargs)

相关内容

  • 没有找到相关文章

最新更新