我正在尝试执行 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
...
我需要类字段
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 ,在那里我可以更好地控制对象实例化?
答案 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;)