【问题标题】:insert with pseudo column in sqlalchemy and postgresql在 sqlalchemy 和 postgresql 中插入伪列
【发布时间】: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


【解决方案1】:

不能通过fetch 命令访问行数。那些是为了得到结果集。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2022-07-02
    • 2019-02-02
    • 2015-05-07
    • 2015-04-19
    相关资源
    最近更新 更多