类上的动态sqlalchemy列

时间:2014-04-17 13:19:46

标签: python orm sqlalchemy

我有各种各样的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)

看起来很简单且相当平易近人,我将开始阅读/打字,但我还没有找到任何示例或正确的搜索术语。类列没有理由需要是静态的,而且可能很简单。这是一件事,还是一件愚蠢的事?

2 个答案:

答案 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 关于如何做到这一点的模板。