sql - pandas.read_sql_query() 如何查询 TEMP 表?

标签 sql python-2.7 pandas sqlalchemy netezza

我正在将 Python 代码转换为新的基于 SQLAlchemy 的 Pandas 0.14.1。

我们使用的一个常见模式是(一般):

connection = db.connect()  # open connection/session

sql = 'CREATE TEMP TABLE table1 AS SELECT ...'
connection.execute(sql)

... other sql that creates TEMP tables from various joins of previous TEMP tables ...

sql = 'CREATE TEMP TABLE tableN AS SELECT ...'
connection.execute(sql)

result = connection.query('SELECT * FROM tableN WHERE ...')

connection.close()

现在,一旦连接关闭,数据库服务器就会清除 TEMP 表。但是,由于最终选择查询使用相同的连接/ session ,因此它可以访问表。

如何使用 SQLAlchemy 和 pd.read_sql_query() 实现类似的目标?

例如:
engine = sqlalchemy.create_engine('netezza://@mydsn')
connection = engine.connect()

sql = 'CREATE TEMP TABLE tmptable AS SELECT ...'
connection.execute(sql)

result = pd.read_sql_query('SELECT * FROM tmptable WHERE ...', engine)

产生 TEMP 表 tmptable 不存在的数据库错误。大概这是因为将引擎传递给 read_sql_query() 需要它打开一个具有独立 session 范围的新连接,因此无法看到 TEMP 表。这是一个合理的假设吗?

有没有办法解决这个问题? (不支持将连接传递给 read_sql_query())

(我知道我可以用 ; 将 SQL 连接成一个字符串,分隔语句,但这是实际情况的简化,其中 TEMP 表是由多个函数创建的,这些函数调用其他嵌套 3-4 深。所以,要实现这一点,需要实现一个层,而不是在发出之前将 SQL 合并到多个调用中,如果有更好的方法,我宁愿避免实现)

使用 -
Pandas :0.14.1
sqlalchemy:0.9.7
pyodbc:3.0.6
Win7 x86_64 Canopy Python 发行版(Python 2.7.6)
Josh Kuhn 的 Netezza SQLAlchemy 方言来自 https://github.com/deontologician/netezza_sqlalchemy

最佳答案

您现在可以通过 SQLAlchemy 连接到 pandas.read_sql .来自 docs :

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

...

con : SQLAlchemy connectable (engine/connection) or database string URI

or DBAPI2 connection (fallback mode)

Using SQLAlchemy makes it possible to use any DB supported by that > library. If a DBAPI2 object, only sqlite3 is supported.


所以,这应该有效:
engine = sqlalchemy.create_engine('netezza://@mydsn')
connection = engine.connect()

sql = 'CREATE TEMP TABLE tmptable AS SELECT ...'
connection.execute(sql)

result = pd.read_sql('SELECT * FROM tmptable WHERE ...', con=connection)

关于sql - pandas.read_sql_query() 如何查询 TEMP 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286615/

相关文章:

sql - 如何在 postgres 中强制执行单向唯一性?

python - 如何在Python中的OrderedDict中访问以前的键和值?

python - Pandas 数据框 : How to print single row horizontally?

mysql - 优化大 `IN` SQL

sql - if @@trancount > 0 提交 tran 问题

python - 井字棋电脑 Action

Python psycopg2 游标

python - 扩展时间增量平均值

python - 使用 pandas.plot 在 python 中自定义直方图中 x 轴的值

sql - (1,1)在SQL中是什么意思?