SQL Alchemy在批处理和保存对象中反映表

时间:2018-08-23 16:05:51

标签: python sqlalchemy teradata

我设置了一个SQLAlchemy工作流,​​以反映数据库中的一组表。这给我带来了一些问题,因为对于我要反映的每个表中的每一列,都会生成一个SQL语句,最终我遇到了活动SQL语句的硬限制。

当前我的工作流程如下:

td_engine = create_engine('teradata://'+user+':'+pswd+'@'+host, echo=True)
Session = sessionmaker()
Session.configure(bind=td_engine)
sess = Session()
metadata = MetaData(td_engine)
Base = declarative_base(cls=DeferredReflection, metadata=metadata)

class table1(Base):
    __tablename__ = 'table1'
    __table_args__ = {'schema': 'schema'}
    some_id = Column(String(length=10), primary_key=True)

class table2(Base):
    __tablename__ = 'table12'
    __table_args__ = {'schema': 'schema'}
    loc_code = Column(DECIMAL(precision=12), primary_key=True)

#...
# there are about 15 table defintions total
#...

@timeit
def prepare_base(base, engine):
    base.prepare(engine)
    return base

Base = prepare_base(Base, td_engine)

运行prepare_base时,我可以看到SQL语句已被激发,并最终出现以下错误:

DatabaseError: (teradata.api.DatabaseError) (0, '[HY000] [Teradata][ODBC Teradata Driver] Beyond SQL_ACTIVE_STATEMENTS limit') 
[SQL: 'SELECT columnname, columntype, columnlength, chartype, decimaltotaldigits, decimalfractionaldigits, columnformat, nullable, defaultvalue, idcoltype \n
FROM dbc.ColumnsV \nWHERE DatabaseName=? AND TableName=?'] [parameters: ('schema', 'tablename')] (Background on this error at: http://sqlalche.me/e/4xp6)

我的问题是: 1.我该如何重写此代码以在批处理步骤中反映每个表,并 2.如何保存表对象/类,以免每次重启内核时都不必从数据库中反映表?

出于我的目的,表结构不会经常更改,因此我们可以认为这不是问题。

0 个答案:

没有答案