python - 最有效的 psycopg2 python 转义函数

标签 python postgresql python-3.x psycopg2

我目前正在尝试使用 (copy_from) 与 psycopy2 进行批量插入。目前我的代码如下。我希望获得一些有关最有效的转义函数和转义包含受限制字符的值的最佳实践的建议。我使用的是python3,字符串来自mongodb。

此处引用了受限制的字符: http://www.postgresql.org/docs/9.2/static/sql-copy.html 从文档中摘取: “可以在 COPY 数据中使用反斜杠字符 () 来引用可能被视为行或列分隔符的数据字符。特别是,如果以下字符作为列值的一部分出现,则必须在其前面添加反斜杠:反斜杠本身、换行符、回车符和当前分隔符。”

def bulk_write(self, table, data, columns = None):
    with psycopg2.connect(database = self.database,
                          user = self.user,
                          host = self.host,
                          password = self.password) as conn:
      with conn.cursor() as cur:
        cur.execute("SET TIME ZONE 'PDT8PST';")
        cols_import = tuple(columns) if columns else None
        data_tsv = '\n'.join(['\t'.join(self.escape_copy_string(str(value)) for value in row) for row in data])
        with open("test","w") as f:
          f.write(data_tsv)
        cur.copy_from(io.StringIO(data_tsv), table, columns=cols_import, null="None")

   def escape_copy_string(self,s):
      s = s.replace("\\","\\\\").replace("\n","\\n").replace("\r","\\r").replace("\t","\\t")
      return s

最佳答案

我建议使用 csv 模块,并在 csv 模式下使用 copy_from,而不是手动滚动它。

如果您使用列表推导式来处理数据,数据也不会那么大。做任何大的事情时,你都会很快耗尽内存。考虑使用一个循环来写入每一行。

关于python - 最有效的 psycopg2 python 转义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24589738/

相关文章:

python - 根据条件选择最后一行并将值存储到变量中

python - Django/Python 邮件列表实现

python - 使用 bash 而不是 sh 作为 python 命令命名空间函数的首选 shell

python-3.x - 为什么gzip不一致?

python - 使用 Selenium 和 Python 禁用 Shockwave Flash 插件

python - 即使我正确初始化,为什么还是收到 'cuMemAlloc failed: not initialized'?

postgresql - 转换对 PostgreSQL 的访问?

sql - 当从 csv 文件加载到 postgres 数据库时,如何解决此错误 "Conversion from string "\N“输入 'Double' 无效”?

postgresql - 是否可以在零停机的情况下将 postgres 9.6 升级到 10。可以遵循哪些方法?

python - 使用 py.test 在 Python 中测试正则表达式