在sqlalchemy和postgresql中插入伪列

时间:2014-03-04 00:33:05

标签: postgresql insert sqlalchemy

我正在尝试使用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)

提前致谢!!

1 个答案:

答案 0 :(得分:1)

不能通过fetch命令访问行计数。那些是获得结果集。

根据psycopg2文档使用cursor.rowcount to get the rowcount