2014-03-04 68 views
0

我想用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) 

在此先感謝!

+0

不要使用多語句。分別運行每條語句。 –

+0

抱歉@CraigRinger,你的意思是打破原來的多個執行?你能澄清一點嗎? –

+0

是的,運行每個語句與一個單獨的'執行'。否則PostgreSQL不知道你想要哪個結果集或行數。 –

回答