【发布时间】:2013-06-01 16:22:16
【问题描述】:
在 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 的文档中找到如何关闭此功能,并且实际上不确定替换发生在哪里。有什么想法吗?
【问题讨论】:
-
为什么使用
pyodbc而不是更高级的psycopg2? -
另外,我想说转换可能在 ODBC 驱动程序中。检查 DSN 设置页面。
-
@CraigRinger 你是对的,我只是尝试了
psycopg2而不是pyodbc并且 LF → CR+LF 不再发生。它真的会在驱动程序中。
标签: python postgresql text newline pyodbc