【发布时间】:2023-03-24 20:30:02
【问题描述】:
我正在尝试将临时表与 SQLAlchemy 一起使用,并将其与现有表连接起来。这就是我目前所拥有的
engine = db.get_engine(db.app, 'MY_DATABASE')
df = pd.DataFrame({"id": [1, 2, 3], "value": [100, 200, 300], "date": [date.today(), date.today(), date.today()]})
temp_table = db.Table('#temp_table',
db.Column('id', db.Integer),
db.Column('value', db.Integer),
db.Column('date', db.DateTime))
temp_table.create(engine)
df.to_sql(name='tempdb.dbo.#temp_table',
con=engine,
if_exists='append',
index=False)
query = db.session.query(ExistingTable.id).join(temp_table, temp_table.c.id == ExistingTable.id)
out_df = pd.read_sql(query.statement, engine)
temp_table.drop(engine)
return out_df.to_dict('records')
这不会返回任何结果,因为to_sql 的插入语句没有运行(我认为这是因为它们是使用sp_prepexec 运行的,但我对此并不完全确定)。
然后我尝试只写出 SQL 语句(CREATE TABLE #temp_table...、INSERT INTO #temp_table...、SELECT [id] FROM...),然后运行pd.read_sql(query, engine)。我收到错误消息
此结果对象不返回行。它已自动关闭。
我猜这是因为该语句不仅仅是SELECT?
我该如何解决这个问题(任何一种解决方案都可以,尽管第一种解决方案更可取,因为它避免了硬编码的 SQL)。需要明确的是,我无法修改现有数据库中的架构——它是一个供应商数据库。
【问题讨论】:
-
ExistingTable有记录吗? -
@AzatIbrakov 是的。实际上,我将其更改为左连接并添加了
temp_table.c.date只是为了确定。我在date列中用None返回行。 -
为什么你的
date列的类型是DateTime而不是Date? -
@AzatIbrakov 这只是一些测试代码。该表有一个日期时间。不过,我认为这不会对输出产生任何影响,对吗?
-
我在
sqlite上测试过它会导致问题
标签: python sql-server pandas sqlalchemy temp-tables