Python / SqlAlchemy:明确地将属性(100s)绑定到Base子类

时间:2016-02-28 03:04:48

标签: python database class sqlite sqlalchemy

我的项目涉及数据争论一些政府表格备案。我有十年的申请,每年大约十几个部分,以CSV的形式。每个CSV都与一个包含字段名称,类型和大小的文件配对。由于数据最初来自某种关系型数据库,我认为处理数据最明智的方法是将其弹出到Sqlite中并使用SqlAlchemy进行查询。

我刚刚开始使用SqlAlchemy,似乎创建数据库对象的典型方法是为每个字段创建一个具有Column属性的类,如下所示:

Base = declarative_base()
class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    ...

然后使用类似

的方式访问表中的行
person = session.query(Person).filter(Person.name == 'bob').all()

但是,这些表中有超过一百个,有些表有超过150个字段。哎呀,不是手工编码。我编写了一个快速脚本来从字段列表中生成.py文件,它可以工作,但感觉有点不像pythonic。

似乎来自some examples我需要传递,而不是实例,但我可能会在这里错过一些细微差别。我尝试使用setattr将属性绑定到基类,但是在使用工厂函数和以各种方式修改继承之后,很明显python的类型管理不会发挥作用。想到的另一件事是尝试搞乱类实例和深度复制,但这似乎也很狡猾。

是否有一种很好/优雅的方法来创建一个带有来自模板的一百个字段的一百个declarative_base子类,或者更重要的是,是否有更好的方法来与这些表进行交互?

1 个答案:

答案 0 :(得分:1)

您可以直接使用SQLAlchemy的Table API并更一般地指定表列类型(带变体),而不是使用更详细的声明性API。

for scary in scary_gov_data:

  t = Table(scary['name'], metadata,
      Column('col1', Integer, primary_key=True),
      Column('col2', String(16), nullable=False))

您真正需要考虑的可能是您使用SQLAlchemy API的方式可能更少,以及更多的结果数据库架构是否会对您必须在其上执行的查询策略有效。

例如,如果一个SQL表有150列,那么本身没有任何错误,但是如果你没有考虑如何查询这些数据,它可能会引起问题。

就使用SQLAlchemy而言,听起来你不想触及这个项目的ORM功能,因为你正在处理更多的原始数据挑战,ORM可能会使事情复杂化。幸运的是,SQLAlchemy的一个神奇之处在于它的ORM是建立在一个出色的低级SQL接口之上的 - 基本上允许你使用Python函数编写非常接近普通SQL查询。

我希望这是有帮助的,如果不是,请随时澄清。