2016-10-04 60 views
0

我想任务SQLAlchemy的ORM创建类Field描述在我的数据库中的所有领域:SQLAlchemy的ORM动态表模式

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进行初始化,然后才能从db中读取记录
  • 在读取表<schema>.fields之前由fieldset.get_schema()确定的模式。

像这样:

session.query(场(字段集)))过滤器(Field.id == '一些字段')

然而,添加

def __init__(self, fieldset) 
    pass 

class Field结果

__init__() takes 1 positional argument...

  • 我可以把所有fields表到一个模式,并添加列“SCHEMA_NAME”,但我仍然需要现场有链接到它的字段集。

可以这样使用SQLAlchemy的ORM做,或者我应该切换到SQLAlchemy的核心,我也不会对对象实例化更多的控制权?

+0

Tab每个模式已经存在名为'fields'的字段?你可以用反射工作吗? –

+0

我的意思是我有点不同的做法:将模式中的'fields'表分别反映到字典中,其中模式是关键字。 –

+0

@IljaEverilä''fields''已经存在。它看起来像反射是SQLAlchemy核心的一部分。我试图在我的“DIY”库中部署SQLAlchemy。你建议我使用Core,还是使用Core创建反射并使用ORM? – Muposat

回答

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__ 

表( '字段',元数据(绑定=无),柱('id',String(length = 20),table =,primary_key = True,nullable = False),schema ='ORK'