我正在尝试使用SQL Expression Language进行SQLAlchemy 0.9和PostgreSQL 9.1的插入。我是sqlalchemy的新手,由于某些原因,目前无法使用ORM。我的原始解决方案使用文本查询,该查询需要引用INSERT FROM SELECT中的伪列。
我的问题是:如何将它从文本语句转换为表达式?
任何帮助都将非常感谢!!
这是我的原始查询,简化(其他列被删除):
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)
这可行并且做我需要的但是我没有得到'结果'内的反馈。我需要知道插入了多少行,如果有的话,但是值或'result'总是None,即使它确实插入了行。这就是我想转换它的原因。
这是我到目前为止所做的,但我无法弄清楚如何将insert语句放在一起......
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)
提前致谢!!