SqlAlchemy Oracle`_get_constraint_data`方法挂有Unicode表名

时间:2018-06-19 12:04:14

标签: python oracle sqlalchemy cx-oracle

更新

如果在Unicode中指定了schema,则会出现此问题。这仅用于_get_constraint_data中的查询。具体来说,使用all_cons_columns进行连接是导致速度下降的原因。其他两个表工作正常。转换为纯string可解决此问题。

sqlalchemy doc建议将对象从string转换为unicode,然后再写入数据库,但这可能不适用于_get_constraint_data方法或带有表名的对象


我最近升级到Oracle 12c,并注意到,如果我使用Table构造一个autoload=True对象,则大约需要35分钟。

逐步执行SqlAlchemy代码,似乎挂起的方法是oracle\base.pyfetchall()的{​​{1}}部分。

我发现奇怪的是,以下内容需要大约35分钟才能运行:

_get_constraint_data

但是,如果我自己构造查询而不替换任何参数,则大约需要3秒钟才能运行:

rp = connection.execute(sql.text(text), **params)
constraint_data = rp.fetchall()

这是最终查询的外观:

rp = connection.execute(sql.text(text))
constraint_data = rp.fetchall()

不确定是什么原因导致此问题。在这两种情况下,似乎在SELECT ac.constraint_name, ac.constraint_type, loc.column_name AS local_column, rem.table_name AS remote_table, rem.column_name AS remote_column, rem.owner AS remote_owner, loc.position as loc_pos, rem.position as rem_pos, ac.search_condition, ac.delete_rule FROM all_constraints ac, all_cons_columns loc, all_cons_columns rem WHERE ac.table_name = u'MY_TABLE' AND ac.constraint_type IN ('R','P', 'U', 'C') AND ac.owner = u'MY_SCHEMA' AND ac.owner = loc.owner AND ac.constraint_name = loc.constraint_name AND ac.r_owner = rem.owner(+) AND ac.r_constraint_name = rem.constraint_name(+) AND (rem.position IS NULL or loc.position=rem.position) ORDER BY ac.constraint_name, loc.position 内部都调用了相同的cursor.fetchall()

0 个答案:

没有答案