我有各种各样的sqlalchemy类,例如:
class OneThing(Base):
id = Column(Integer, Sequence('one_thing_seq'), primary_key=True)
thing = Column(Boolean())
tag = Column(String(255))
class TwoThing(Base):
id = Column(Integer, Sequence('two_thing_seq'), primary_key=True)
thing = Column(Boolean())
tag = Column(String(100))
即。 sqlalchemy
的相当标准的类结构问题:有没有办法更好地控制列创建,还是需要相对静态?我至少喜欢将这些更普通的列及其导入整合到这样的多个文件中(不是作为mixin,因为我已经为某些不同模型的列做了这些,但是这个函数是返回基于潜在变量的列:
class OneThing(Base):
id = Base.id_column()
thing = Base.bool_column
tag = Base.string_col(255)
class OneThing(Base):
id = Base.id_column()
thing = Base.bool_column
tag = Base.string_col(255)
看起来很简单且相当平易近人,我将开始阅读/打字,但我还没有找到任何示例或正确的搜索术语。类列没有理由需要是静态的,而且可能很简单。这是一件事,还是一件愚蠢的事?
答案 0 :(得分:1)
from sqlalchemy import Column, Boolean, Integer
def c_id():
return Column(Integer, primary_key=True)
def c_bool():
return Column(Boolean, nullable=False, default=False)
def c_string(len):
return Column(String(len), nullable=False, default='')
class Thing(Base):
id = c_id()
thing = c_bool()
tag = c_string(255)
SQLAlchemy开发人员在此处详细介绍:http://techspot.zzzeek.org/2011/05/17/magic-a-new-orm/
答案 1 :(得分:1)
Column()调用并不神奇;您可以使用任何随机方式来创建适当的对象。神奇(即将列绑定到变量名和表)发生在Base
的元类中。
因此,一个解决方案是让您编写自己的代码,返回一个Column()或三个 - 没有什么可以阻止您这样做:
class Thing(Base):
id,thing,tag = my_magic_creator()
另一方面,你可以批量删除所有这些作业,并在元类中完成工作;在这里看到我的答案:Creating self-referential tables with polymorphism in SQLALchemy 关于如何做到这一点的模板。