【问题标题】:PostgreSQL equivalent of MySQL --force flagPostgreSQL 等效于 MySQL --force 标志
【发布时间】:2014-11-24 20:07:16
【问题描述】:

我正在将 10000 条记录批量插入 Postgres:

INSERT INTO TABLE VALUES (v1),...,(v10000)

我通过 Python Psycopg2 库执行此操作。目前,如果其中一个元组,比如 5000 个炸弹(例如,如果一个字段的类型错误),我的整个批量插入将失败,因为生成了一个异常。我正在寻找等效的 MySQLs --force 标志来解决这个问题;它告诉 MySQL 继续处理任何错误 (http://dev.mysql.com/doc/refman/5.0/en/mysql-command-options.html#option_mysql_force)

我这里什么都看不到,这是一个更新的PG,这很令人担忧:http://www.postgresql.org/docs/9.3/static/sql-select.html

【问题讨论】:

  • 轰炸什么?
  • 例如“值 X 对于“smallint”来说太大了”。我只想不插入所有违反某种数据插入错误的行并继续。因为我不提前知道所有可能的数据错误,所以我宁愿在尝试插入之前不实现这个逻辑来检查元组……那将是一场噩梦。
  • 我认为这是不可能的。 Postgres 的事务处理比 MySQL 的更严格。 Postgres 不支持只能提交部分语句的事务,因为它违反了事务的“原子”概念。可以完成这样的事情的唯一方法是使用单个插入和每个插入的保存点。但这会很慢。

标签: postgresql psycopg2


【解决方案1】:

告诉 psycopg 你希望它使用“自动提交”的事务隔离级别,即它不会为你打开一个事务并且每个语句都会自动提交。请注意,您必须捕获异常并忽略(或更好地记录)它们。示例:

import psycopg2
import psycopg2.extensions

conn = psycopg2.connect("...")
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
curs = conn.cursor()

for row in your_data:
    try:
        curs.execute("INSERT INTO table VALUES (%s, %s, ...)", row)
    except Exception, err:
        print err

 # no need to commit!

【讨论】:

  • 批量插入是事务的一部分,如果事务中的其他内容失败,则必须回滚;这有影响吗?
  • 当然。您不能在内部事务中“自动提交”,抱歉。如果我是你,我会简单地重新排序 SQL:使用自动提交填充批量表;启动事务,如果失败,只需删除行/删除批量表。
【解决方案2】:

在 psql \set ON_ERROR_ROLLBACK on 中执行此操作,然后再试一次

【讨论】:

  • 作为交易的一部分,我是否首先执行此操作?如前所述,我通过 Psycopg2 进行交互,而不是本机 psql CLI。
  • 是的,这对我没有帮助。除非我可以永远设置这个东西。
  • 好吧。它是一个运行时配置参数,所以我想它可以在 postgresql.conf 中设置。
猜你喜欢
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2011-07-02
  • 2023-03-07
  • 2020-11-05
  • 2015-10-12
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多