PostgreSQL psycopg2 Python3.7.4 UnicodeDecodeError: 'ascii' codec 无法解码字节



我正试图使用ANSI驱动程序从PostgreSQL数据库进行查询,但对于某些查询,它失败了,导致以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xfd in position 10: ordinal not in range(128)

以下是设置连接和查询的功能:

import psycopg2
import pandas as pd
def query_cdk_database(query):
conn = psycopg2.connect(host="some_host", port = xxx, 
database="xxx", user="xxxx",
password="xxx", client_encoding ='auto')
cur = conn.cursor()
cur.execute(query)
dat = cur.fetchall()
cur.close()
conn.close()
return dat

不得不说,就查询的不确定性而言,它是有效的,但对一些人来说,它是坏的。这里有一个总是坏的:

query = u"SELECT * FROM ed.VehicleSales_v"
x = query_cdk_database(query)

它返回以下错误:

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-26-06ace3c63c62> in <module>
1 query = u"SELECT * FROM ed.VehicleSales_v;"
----> 2 x = query_raw(query)
<ipython-input-20-6abf4dcf327f> in query_raw(query)
7     cur = conn.cursor()
8     cur.execute(query)
----> 9     dat = cur.fetchall()
10     cur.close()
11     conn.close()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfd in position 10: ordinal not in range(128)

为了解决这个问题,我尝试了以下方法:

  • 将psycopg2.中的连接参数"client_encoding"更改为几个不同的连接参数
  • 逐个循环遍历所有列,以检测哪一列返回错误,但单独地,没有一个返回错误
  • 将查询字符串转换为unicode或其他不同的编解码器
  • 从PGAdmin手动原始下载数据,然后用panda读取,但带有警告"DtypeWarning:列(4,55,70153(具有混合类型"(这可能是一个单独的问题(

我使用pyodbc包解决了这个问题。此处:

import pyodbc
import pandas as pd
conn_str = (
"DRIVER={PostgreSQL Unicode};"
"DATABASE=adp_report;"
"UID=db_name;"
"PWD=password;"
"SERVER=111.111.11.11;"
"PORT=5432;"
)

注意;DRIVER={PostgreSQL Unicode}"就是那根绳子。因为其他论点会相应地改变它们。这里有一个方便的函数,用于传递数据库中的连接字符串和查询。

def query_db(query):
conn = pyodbc.connect(conn_str)
dat = pd.read_sql(query, conn)
conn.close()
return dat

相关内容

最新更新