Próbuję użyć użyć tabeli tymczasowej z SQLAlchemy i dołączyć do istniejącej tabeli. To, co mam tak dalekoUżyj tabeli tymczasowej z 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 nie zwraca żadnych wyników, ponieważ INSERT że to_sql
robi nie dostać run (myślę, że to dlatego, że są prowadzone za pomocą sp_prepexec
, ale nie jestem całkowicie na ten temat pewny).
Następnie próbowałem po prostu wypisać instrukcję SQL (CREATE TABLE #temp_table...
, INSERT INTO #temp_table...
, SELECT [id] FROM...
), a następnie uruchomić pd.read_sql(query, engine)
. Otrzymuję komunikat o błędzie
Ten obiekt wyników nie zwraca wierszy. Został zamknięty automatycznie.
Zgaduję, że to dlatego, że oświadczenie ma więcej niż tylko SELECT
?
W jaki sposób mogę rozwiązać ten problem (albo rozwiązanie zadziała, chociaż pierwsze byłoby lepsze, ponieważ unika zakodowanego kodu SQL). Aby było jasne, nie mogę zmodyfikować schematu w istniejącej bazie danych - jest to baza danych dostawcy.
Czy są jakieś zapisy w 'ExistingTable'? –
@AzatIbrakov Tak. Właściwie to zmieniłem go na lewe sprzężenie i dodałem 'temp_table.c.date' tylko po to, aby się upewnić. Otrzymuję wiersze z powrotem z 'None' w kolumnie' date'. –
dlaczego twoja kolumna 'date' ma typ' DateTime' zamiast 'Date'? –