pow*_*owo 6 python postgresql psycopg2
在我的应用程序中,我使用带有"text"列的postgresql数据库表来存储pickled python对象.作为数据库驱动程序我正在使用psycopg2,直到现在我只将python-strings(不是unicode-objects)传递给DB并从DB中检索字符串.这基本上工作正常,直到我最近决定使String处理更好/更正的方式并将以下构造添加到我的DB层:
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
Run Code Online (Sandbox Code Playgroud)
这在我的应用程序中无处不在,我现在正在使用unicode对象.
但是对于包含pickle对象的text-column的这种特殊情况,它会带来麻烦.我通过这种方式在我的测试系统中工作:
SELECT data::bytea, params FROM mytable execute("UPDATE mytable SET data=%s", (psycopg2.Binary(cPickle.dumps(x)),) )...但不幸的是,我在生产系统中的某些列中遇到SELECT错误:
psycopg2.DataError: invalid input syntax for type bytea
Run Code Online (Sandbox Code Playgroud)
当我尝试在psql shell中运行查询时,也会发生此错误.
基本上我打算将列从"text"转换为"bytea",但上面的错误也阻止我进行这种转换.
据我所知,(当将列检索为纯python字符串时)字符串中只有ord(c)<= 127的字符.
问题是,铸造text到bytea并不意味着,以字节字符串中和组装它们作为一个bytea值,而是采取了串并把它解释为逃脱输入值bytea类型.所以这不起作用,主要是因为pickle数据包含大量反斜杠,这些反斜杠bytea特别解释.
试试这个:
SELECT convert_to(data, 'LATIN1') ...
Run Code Online (Sandbox Code Playgroud)
这会将字符串转换为byteaLATIN1编码中的字节序列(值).对你而言,确切的编码并不重要,因为它都是ASCII(但没有ASCII编码).
| 归档时间: |
|
| 查看次数: |
5346 次 |
| 最近记录: |