我正在嘗試使用SQLAlchemy使用臨時表,並將其與現有表聯接起來。這是我迄今爲止在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'返回行。 –
爲什麼你的'日期'列的類型是'DateTime'而不是'Date'? –