SQLAlchemy ORM与动态表架构

时间:2016-10-04 23:38:25

标签: python sqlalchemy

我正在尝试执行 SQLAlchemy ORM 来创建描述我数据库中所有字段的类Field

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Field(Base):
    __tablename__ = 'fields'
    __table_args__ = {'schema':'SCM'}
    id = Column(String(20), primary_key=True)

问题是表fields描述了不同模式中的不同字段,即

SCM.fields
TDN.fields
...

我需要类字段

  • 在从db
  • 读取记录之前,使用对象fieldset进行初始化
  • 在读取表fieldset.get_schema()之前由<schema>.fields确定的架构。

这样的事情:

session.query(Field(fieldset)))。filter(Field.id ==&#39; some field&#39;)

然而,添加

def __init__(self, fieldset)
    pass

class Field会产生

  

__init__() takes 1 positional argument...

  • 我可以将所有fields表格合并到一个架构中,并添加列&#39; schema_name&#39;但是我仍然需要Field链接到它的fieldset。

可以使用 SQLAlchemy ORM 来完成,还是应该切换到 SqlAlchemy Core ,在那里我可以更好地控制对象实例化?

1 个答案:

答案 0 :(得分:1)

所以问题是可以解决的,解决方案记录为Augmenting the Base

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declared_attr, declarative_base

class Field:
    __tablename__ = 'fields'

    @declared_attr
    def __table_args__(cls):
        # schema will be part of class name, which works for me
        # Example: class FieldSCM --> Field with schema SCM
        return dict(schema=cls.__name__[5:].upper())

    id = Column(String(20), primary_key=True)

Field = declarative_base(cls=Field)


class FieldSet:
    def __init__(self, schema):
        self.fieldtype  = type('Field' + schema.upper(), (Field,), {})

概念证明:

FieldSet('ork').fieldtype.__table__
  

表(&#39;字段&#39;,MetaData(bind =无),列(&#39; id&#39;,字符串(长度= 20),表=,primary_key = True,nullable = False) ,schema =&#39; ORK&#39;)