避免使用Teradata和Sqlalchemy僵局



我正在使用 sqlalchemy sqlalchemy-teradata 在我的数据库上查询。> sqlalchemy 生成的每个选择语句都会生成一个表锁定,该锁会影响其他并发用户,这些用户在上一个用户读取它时无法在表上执行任何插入,更新或删除表上的操作。为了避免使用这样的表锁,我需要在之前添加以下字符串 SELECT语句:

LOCK ROW FOR ACCESS
SELECT * FROM DATABASE.TABLE;

如何覆盖sqlalchemy选择语句以添加此字符串?请注意,我还在这里在Github上提出了这个问题,但到目前为止还没有找到任何解决方案:https://github.com/teradata/sqlalchemy-teradata/issues/39

[update]

连接到teradata时,我添加了下面提供的语句:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base, DeferredReflection
from sqlalchemy.orm import scoped_session, sessionmaker
[...]
engine = create_engine('teradata://' + user + ':' + password + '@' + host + ':22/' + database)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
db_session.execute('SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;')  # To avoid locking tables when doing select on tables
Base = declarative_base(cls=DeferredReflection)
Base.query = db_session.query_property()

但是现在,当Sqlalchemy试图读取Teradata Meta数据时,我有以下错误消息:

sqlalchemy.exc.databaseerror :( teradata.api.databaseerror((3932, '[25000] [teradata] [odbc teradata驱动程序] [teradata数据库] 在DDL声明后,ET或NULL陈述是合法的。'([SQL:'选择 柱名,列型,列长,图形类型,十分位构象, 十进制尺寸,柱状图,无效,默认值, idcoltype nfrom dbc.columnsv n where databaseName =?和tablename =?'] [参数:('dev_migration_tool','migration_object_type']

连接到teradata时,我添加了上面的注释中提供的语句。请注意,在ANSI模式会话中,SET SESSION被视为必须合作的DDL语句。需要以下内容以避免上述初始文章中触发的错误消息:db_session.commit()

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base, DeferredReflection
from sqlalchemy.orm import scoped_session, sessionmaker
[...]
engine = create_engine('teradata://' + user + ':' + password + '@' + host + ':22/' + database)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
db_session.execute('SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;')  # To avoid locking tables when doing select on tables
db_session.commit()
Base = declarative_base(cls=DeferredReflection)
Base.query = db_session.query_property()

最新更新