gpt4 book ai didi

python - psycopg2 lobject 类 - 使用位流插入大对象

转载 作者:行者123 更新时间:2023-11-29 06:19:32 25 4
gpt4 key购买 nike

python + psycopg2 中是否可以创建/编写一个 Postgresql 大对象使用比特流而不是在文件系统上输入指向本地文件的路径?

为什么有这个要求

我正在编写数据库迁移脚本 mysql > postgresql。在源数据库 (mysql) 中,二进制文件存储在一个 longblob 字段中。

使用标准方法/方法将大对象导入 postgresql 会有点矫枉过正,因为它需要输入本地文件的路径,因此我必须在执行之前将每个二进制文件转储到操作系统本地文件中大对象导入。

我尝试过的

this link 阅读官方 psycopg2 文档,似乎(但我不确定)可以使用 write(str)方法。这是 lo_write 函数的包装器。

我一直在尝试以多种不同方式使用此方法,但都没有成功。我认为靠近的那个是这个,但我得到一个 TypeError:

cnx_psql.lobject(0, mode='w').write( row['content'] )
TypeError: lobject.write requires a string; got bytearray instead

其中 row['content'] 是我之前从 longblob 类型的 mysql 字段中选择的数据。


有人知道如何实现吗?

提前感谢您提供任何信息,

如果我遗漏了什么,请告诉我。

最佳答案

第一个选项:外部数据包装器

也许您可以使用外部数据包装器,例如 mysql_fdw? http://pgxn.org/dist/mysql_fdw/

有了这个你就可以在postgresql数据库中创建一个外部表,然后就可以了

insert into new_table select * from foreign_table;

... 并且服务器会将外部(MySQL)表中的所有记录拉入本地表,甚至不会将数据传输到客户端。您可以轻松地将 MySQL 中的 LONGBLOB 映射到 PostgreSQL 中的 bytea。 bytea 类型允许长度最大为 1GB 的值。

要获得更多感受,请参阅 http://michael.otacoo.com/postgresql-2/postgresql-playing-with-foreign-data-wrappers-1/https://wiki.postgresql.org/wiki/Foreign_data_wrappers

第二个选项:复制

如果这没有用,也许您可​​以使用 COPY。 Psycopg2 的光标有 good COPY support ,它接受一个文件对象,只要它具有 .read() 和 .readline() 即可,基本上可以是任何你想要的东西。

第三个选项:修复您遇到的错误。如果您真的知道自己在做什么并且已经阅读了 the differences and limitations when using lobject vs. bytea并且仍然想使用 lobject,然后修复错误。 Write 显然需要字符串,但您传入的是 bytearray。转换取决于 Python 版本,请参阅 How to convert my bytearray('b\x9e\x18K\x9a') to something like this--> '\x9e\x18K\x9a'<---just str ,not array

编辑:发布有点太早了。

关于python - psycopg2 lobject 类 - 使用位流插入大对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34025082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com