2013-06-01 58 views
1

在MS Windows上,使用Python 3的pyodbc模塊,我正在使用PostgreSQL。當我使用PostgreSQL的TEXT數據類型並嘗試存儲類UNIX的EOL時,原始\n被替換爲\r\n。看下面的例子。PostgreSQL在文本字段中使用Python替換LF + CR + LF pyodbc

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的文檔中關閉此功能,並且我不確定替換是在哪裏發生的。有任何想法嗎?

+1

爲什麼使用'pyodbc'而不是比較高級的'psycopg2'? –

+2

另外,我會說轉換可能是在ODBC驅動程序。檢查DSN設置頁面。 –

+0

@CraigRinger你是對的,我只是嘗試過''psycopg2''而不是''pyodbc'',LF→CR + LF不再發生。它真的在司機之內。 – Tregoreg

回答

2

很可能它是ODBC驅動程序的行爲,而不是它的Python接口。也就是說,使用psycopg2幾乎肯定會更好,這會更簡單,更強大,更快速。

就像psqlODBCpsycopg2包裝libpq但它沒有笨重的ODBC中間層。

+0

我剛剛發佈了根據您的建議發現的配置窗口的屏幕截圖。然而,你說得對,''pyodbc''可能是個奇怪的選擇。我會重構我的代碼並切換到''psycopg2'',儘管我的代碼大小爲30 kB :-( – Tregoreg

+0

好極了!我做了一些正則表達式/手動重構並完全切換到「psycopg2」。所有的單元測試似乎現在工作得很好:-) – Tregoreg

+0

@Tregoreg很高興聽到您的聲音,並感謝您在psqlODBC中爲它準確配置選項。我使用的是Fedora 18而不是Windows,因此我很難找到它;-) –

1

基於@ CraigRinger的提示,我已經能夠使用%windir%\system32\odbcad32.exe添加新的DSN,PostgreSQL35W。該配置允許我們在下面的截圖如圖所示關閉LF↔CR/LF轉換:

Options page for PostgreSQL DNS

DSN=PostgreSQL35W使用代替DRIVER={PostgreSQL Unicode(x64)}固定的問題。