psycopg2 lobject class - 使用比特流插入大对象
psycopg2 lobject class - insert large objects using bit stream
在python
+ psycopg2
中是否可以create/write一个Postgresql
大对象使用比特流而不是在文件系统上输入指向本地文件的路径?
为什么有这个要求
我正在编写数据库迁移脚本 mysql > postgresql。在源数据库 (mysql) 中,二进制文件存储在 longblob 字段中。
使用标准 approach/method 将大对象导入 postgresql 会有点矫枉过正,因为它需要输入本地文件的路径,因此我必须将每个二进制文件转储到 OS 执行大对象导入之前的本地文件。
我试过的
阅读 psycopg2
官方文档 this link, it seems ( but I'm not sure ) to be possible using the 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 数据库中创建一个外部 table,然后就可以
insert into new_table select * from foreign_table;
... 并且服务器会将所有记录从外部 (MySQL) table 拉入本地 table,甚至不会将数据传输到客户端。您可以轻松地将 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
如果这没有用,也许您可以使用 COPY。 Psycopg2 的游标有 good COPY support,它接受一个文件对象,只要它有 .read() 和 .readline() 即可。
第三个选项:修复您遇到的错误。
如果您真的知道自己在做什么并且已经阅读 the differences and limitations when using lobject vs. bytea and still want to use lobject, then fix the error. Write apparently requires string, but you're passing in bytearray. Converting depends on Python version, see How to convert my bytearray('b\x9e\x18K\x9a') to something like this--> '\x9e\x18K\x9a'<---just str ,not array
编辑: 发帖有点太早了。
在python
+ psycopg2
中是否可以create/write一个Postgresql
大对象使用比特流而不是在文件系统上输入指向本地文件的路径?
为什么有这个要求
我正在编写数据库迁移脚本 mysql > postgresql。在源数据库 (mysql) 中,二进制文件存储在 longblob 字段中。
使用标准 approach/method 将大对象导入 postgresql 会有点矫枉过正,因为它需要输入本地文件的路径,因此我必须将每个二进制文件转储到 OS 执行大对象导入之前的本地文件。
我试过的
阅读 psycopg2
官方文档 this link, it seems ( but I'm not sure ) to be possible using the 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 数据库中创建一个外部 table,然后就可以
insert into new_table select * from foreign_table;
... 并且服务器会将所有记录从外部 (MySQL) table 拉入本地 table,甚至不会将数据传输到客户端。您可以轻松地将 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
如果这没有用,也许您可以使用 COPY。 Psycopg2 的游标有 good COPY support,它接受一个文件对象,只要它有 .read() 和 .readline() 即可。
第三个选项:修复您遇到的错误。 如果您真的知道自己在做什么并且已经阅读 the differences and limitations when using lobject vs. bytea and still want to use lobject, then fix the error. Write apparently requires string, but you're passing in bytearray. Converting depends on Python version, see How to convert my bytearray('b\x9e\x18K\x9a') to something like this--> '\x9e\x18K\x9a'<---just str ,not array
编辑: 发帖有点太早了。