1

在 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 的文档中找到如何关闭此功能,并且实际上不确定替换发生在哪里。有任何想法吗?

4

2 回答 2

2

很可能这是 ODBC 驱动程序本身的行为,而不是 Python 接口的行为。也就是说,您几乎肯定会更好地使用psycopg2,它会更简单、更强大、更快。

就像psqlODBC, psycopg2wrapslibpq但它没有笨重的 ODBC 中间层。

于 2013-06-01T17:15:11.563 回答
1

根据@CraigRinger 的提示,我已经能够PostgreSQL35W使用%windir%\system32\odbcad32.exe. 该配置允许我们关闭 LF ↔ CR/LF 转换,如下图所示:

PostgreSQL DNS 的选项页面

使用DSN=PostgreSQL35W而不是DRIVER={PostgreSQL Unicode(x64)}解决问题。

于 2013-06-01T17:33:36.370 回答