[英]PostgreSQL replaces LF with CR+LF in TEXT fields using Python pyodbc
在MS Windows上,使用Python 3的pyodbc
模块,我正在使用PostgreSQL。 当我使用PostgreSQL的TEXT
数据类型并尝试存储类似UNIX的EOL时,原始\\n
将被替换为\\r\\n
。 请参阅下面的示例。
import pyodbc
def main():
connection = pyodbc.connect(
'DRIVER={PostgreSQL Unicode(x64)};'
'SERVER=127.0.0.1;'
'UID=postgres;'
'PWD=topsecret;'
'DATABASE=db1');
cursor = connection.cursor();
cursor.execute('CREATE SCHEMA schema1 '
'CREATE TABLE table1 ('
'key SERIAL PRIMARY KEY,'
'value TEXT'
')');
cursor.execute('INSERT INTO schema1.table1 (value) VALUES (?)',
'hello\nworld');
r = cursor.execute('SELECT value FROM schema1.table1').fetchone()[0];
print(r == 'hello\nworld'); # prints False
print(r == 'hello\r\nworld'); # prints True
if __name__ == '__main__':
main();
实际上,在某些情况下,这种行为可能是有利的。 但是,就我而言,这是不可取的。 我无法在PostgreSQL的文档中找到如何关闭此功能,并且实际上并不确定替换发生在何处。 有任何想法吗?
很可能它是ODBC驱动程序的行为,而不是它的Python接口。 也就是说,使用psycopg2
几乎肯定会更好,这将更简单,更强大,更快。
就像psqlODBC
一样, psycopg2
包装libpq
但它没有笨重的ODBC中间层。
根据@ CraigRinger的提示,我已经能够使用%windir%\\system32\\odbcad32.exe
添加新的DSN, PostgreSQL35W
。 配置允许我们关闭LF↔CR/ LF转换,如下面的屏幕截图所示:
使用DSN=PostgreSQL35W
而不是DRIVER={PostgreSQL Unicode(x64)}
修复了问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.