【发布时间】:2014-03-04 00:33:04
【问题描述】:
我正在尝试使用 SQL 表达式语言对 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)
这有效并且可以满足我的需要,但我没有在“结果”中得到反馈。我需要知道插入了多少行(如果有),但值或“结果”始终为 None,即使它确实插入了行。这就是我想要转换它的原因。
这是我到目前为止所做的,但我不知道如何将插入语句放在一起......
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,你的意思是把原始文件分成多次执行吗?你能澄清一下吗?
-
是的,使用单独的
execute运行每个语句。否则 PostgreSQL 不知道你想要从哪一个结果集或行数。 -
我把它分解成单独的语句,但是当我执行插入时,我仍然无法取回插入的行数。当我运行这个: conn.execute(insert_statement).fetchall() 我得到 ResourceClosedError: This result object does not return rows。它已自动关闭。 :(
-
新的 insert_statement 只是 "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;" 按照建议单独使用。
标签: postgresql insert sqlalchemy