我正在将 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/