【问题标题】:PostgreSQL replaces LF with CR+LF in TEXT fields using Python pyodbcPostgreSQL 使用 Python pyodbc 在 TEXT 字段中将 LF 替换为 CR+LF
【发布时间】: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


【解决方案1】:

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

就像 psqlODBCpsycopg2 包装 libpq 但它这样做没有笨重的 ODBC 中间层。

【讨论】:

  • 我刚刚发布了我根据您的建议发现的配置窗口的屏幕截图。但是,您说得对,pyodbc 可能是一个奇怪的选择。我将重构我的代码并切换到psycopg2,尽管我的代码大小为 30 kB :-(
  • 太棒了!我做了一些正则表达式/手动重构并完全切换到psycopg2。现在所有的单元测试似乎都工作得很好:-)
  • @Tregoreg 很高兴听到您的成功,感谢您在 psqlODBC 中跟进准确的配置选项。我使用的是 Fedora 18 而不是 Windows,所以我很难找到它;-)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2016-05-09
    • 2010-12-04
    • 2016-03-28
    • 2011-03-07
    • 2011-06-03
    相关资源
    最近更新 更多