我想用SQLAlchemy 0.9和PostgreSQL 9.1插入,使用SQL表達式語言。我是sqlalchemy的新手,因爲原因,目前無法使用ORM。我原來的解決方案使用了一個需要在INSERT FROM SELECT中引用僞列的文本查詢。插入與僞列在sqlalchemy和postgresql
我的問題是:如何將它從文本語句轉換爲表達式?
任何幫助將非常感謝!
這是我原來的查詢,簡化(其它列被刪除):
statement = """
CREATE TEMP TABLE tmp(event_id);
COPY tmp FROM '%(csv_file)s' WITH CSV HEADER QUOTE '''';
INSERT INTO permanent_table (source_system, event_id)
SELECT '%(src)s', tmp.event_id
FROM tmp
LEFT JOIN permanent_table pt ON (tmp.event_id=pt.event_id AND pt.source_system='%(src)'
WHERE pt.event_id IS NULL;
""" % {'csv_file':somefile, 'src':'SYS1'}
我目前運行這樣說:
with engine.begin() as conn:
result = conn.execute(statement)
這工作和做什麼,我需要,但我不'結果'裏面沒有得到反饋。我需要知道插入了多少行(如果有),但值或'結果'始終爲無,即使它插入了行。這就是我想要轉換它的原因。
這是我迄今所做的,但我無法弄清楚如何把插入語句一起...
with engine.begin() as conn:
pt = sqlalchemy.Table('permanent_table',metadata,autoload=True,autoload_with=engine, schema='test')
tmp = Table('tmp',metadata,Column('event_id', String(100)))
metadata.create_all()
copy_statement = """COPY tmp FROM '%(csv_file)s' WITH CSV HEADER QUOTE'''';""" % {'csv_file':somefile}
s=select([tmp])
result = conn.execute(s).fetchone()
print result
通過以上我可以確認,我將東西變成' tmp':
result (u'113938227820000400')
我該如何構建插入壽命?這失敗:
insert_statement = pt.insert().from_select(
['source_system','event_id'],
tmp.select(['%(src)s', tmp]).join(pt,
pt.c.event_id==tmp.c.event_id).where(pt.c.event_id==None)
result=conn.execute(insert_statement)
在此先感謝!
不要使用多語句。分別運行每條語句。 –
抱歉@CraigRinger,你的意思是打破原來的多個執行?你能澄清一點嗎? –
是的,運行每個語句與一個單獨的'執行'。否則PostgreSQL不知道你想要哪個結果集或行數。 –