2012-10-25 81 views
1

我需要使用SQLAlchemy創建並連接到數據庫PostgreSQL 9.2。到目前爲止,我可以用UTF-8創建完整的數據庫,但是我無法將非ASCII字符放入其中。這就是我如何連接到數據庫:SQLAlchemy with PostgreSQL Unicode問題

url = URL(drivername=s'postgresql', username='uname', password='pwd', host='localhost', port='5432', database='postgres')
self.engine = create_engine(url)

然後,我創建了新的數據庫,切換到它,並開始填充它:一切正常。我得到這個:

entercursor.execute(statement, parameters)
sqlalchemy.exc.DataError: (DataError) invalid byte sequence for encoding "UTF8": 0xec2d43
'INSERT INTO province (codice_regione, codice, tc_provincia_id, nome, sigla) VALUES (%(codice_regione)s, %(codice)s, %(tc_provincia_id)s, %(nome)s, %(sigla)s) RETURNING province.id' {'nome': 'Forl\xec-Cesena', 'codice': 40, 'codice_regione': 8, 'tc_provincia_id': 34, 'sigla': 'FC'}

我有相同的代碼爲MySQL 5上的同一個數據庫,它的工作原理完美。我不知道什麼是錯的。我註冊了unicode的postgres的擴展名,但這不起作用。我感到困惑,我需要更有經驗的人的幫助。

回答

1

確保可以包含國際字符的數據是Unicode字符串。您試圖插入的字符串'Forl\xec-Cesena',是Latin1ISO-8859-1)編碼。因此,使用

unicode('Forl\xec-Cesena','Latin1') 

將其轉換爲unicode字符串。

+0

謝謝我解決了 – arpho

3

根據錯誤日誌,0xec2d43序列在iso-8859-1中對應於3個字符ì-C,該字符將成爲名稱'Forlì-Cesena'的一部分。

因此,該程序發送有效的ISO-8559-1,而不是UTF-8,而服務器期望UTF-8。

來解決這個問題最簡單的方法是告知服務器有關的實際編碼,通過在客戶端發出這條SQL語句:經過之前的數據

SET client_encoding=latin1; 

無論是或轉換爲UTF-8它到數據庫,這是@ Tometzky的答案。

+0

感謝您的回答,我在create_engine上添加了encoding ='latin1',並且當我將數據傳遞給映射器的構造函數時,現在我得到此錯誤返回codecs.utf_8_decode(input,errors,True ) UnicodeDecodeError:'utf8'編解碼器無法解碼位置4中的字節0xec:無效延續字節 – arpho

+1

@arpho client_encoding影響從數據庫返回的數據,以及數據庫如何解釋您發送給它的數據。因此,您必須將數據從數據庫解碼爲'latin1'或'iso-8859-1'而不是'utf-8'。 –

+0

我解決了謝謝 – arpho