直接在 Python 中重新创建 Postgres COPY?

发布于 2024-08-14 04:45:47 字数 239 浏览 6 评论 0原文

我有一个数据块,目前是 n 元组列表,但格式非常灵活,我想将其附加到 Postgres 表中 - 在这种情况下,每个 n 元组对应于数据库中的一行。

到目前为止,我一直在做的是将这些内容全部写入 CSV 文件,然后使用 postgres 的 COPY 将所有这些内容批量加载到数据库中。这可行,但不是最理想的,我更希望能够直接从 python 完成这一切。 python 中是否有一种方法可以在 Postgres 中复制 COPY 类型的批量加载?

I have a block of data, currently as a list of n-tuples but the format is pretty flexible, that I'd like to append to a Postgres table - in this case, each n-tuple corresponds to a row in the DB.

What I had been doing up to this point is writing these all to a CSV file and then using postgres' COPY to bulk load all of this into the database. This works, but is suboptimal, I'd prefer to be able to do this all directly from python. Is there a method from within python to replicate the COPY type bulk load in Postgres?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小矜持 2024-08-21 04:45:47

如果您使用的是 psycopg2 驱动程序,则游标提供 copy_tocopy_from 函数,可以从任何类似文件的对象(包括 StringIO > 缓冲区)。

文件 examples/copy_from.py 和 < 中有示例a href="https://github.com/psycopg/psycopg2/blob/master/examples/copy_to.py" rel="noreferrer">examples/copy_to.py 附带 psycopg2 源代码分发

此摘录来自 copy_from.py 示例:

conn = psycopg2.connect(DSN)
curs = conn.cursor()
curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)")

# anything can be used as a file if it has .read() and .readline() methods
data = StringIO.StringIO()
data.write('\n'.join(['Tom\tJenkins\t37',
                  'Madonna\t\N\t45',
                  'Federico\tDi Gregorio\t\N']))
data.seek(0)

curs.copy_from(data, 'test_copy')

If you're using the psycopg2 driver, the cursors provide a copy_to and copy_from function that can read from any file-like object (including a StringIO buffer).

There are examples in the files examples/copy_from.py and examples/copy_to.py that come with the psycopg2 source distribution.

This excerpt is from the copy_from.py example:

conn = psycopg2.connect(DSN)
curs = conn.cursor()
curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)")

# anything can be used as a file if it has .read() and .readline() methods
data = StringIO.StringIO()
data.write('\n'.join(['Tom\tJenkins\t37',
                  'Madonna\t\N\t45',
                  'Federico\tDi Gregorio\t\N']))
data.seek(0)

curs.copy_from(data, 'test_copy')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文