Python,Postgres - SQL查询where子句,带有string =Curaçao

时间:2016-07-05 21:20:17

标签: python postgresql psycopg2

我在使用Python 2.7,psycopg2和Postgres的Windows 8环境中。

Postgres数据库具有以下编码:

Encoding    UTF8
Collation   English_United States.1252
Character Type  English_United States.1252
Tablespace  pg_default

我已将记录插入此数据库,该记录具有基于国家/地区名称的文件名,值如:

cuba.png
curaçao.png
cyprus.png
czech_republic.png
côte_d'ivoire.png
democratic_republic_of_congo.png            

我的文件夹中有相应名称的文件:

cuba.png
curaçao.png
cyprus.png
czech_republic.png
côte_d'ivoire.png
democratic_republic_of_congo.png

我使用此代码循环遍历文件,然后使用UPDATE将文件详细信息写回数据库,并使用WHERE子句将数据库记录文件名与实际文件名进行比较。

import os, os.path
from PIL import Image
import psycopg2

conn_string = \
    "host='localhost' \
    dbname='dbname' \
    user='username' \
    password='password'" 

conn = psycopg2.connect(conn_string)     
cur = conn.cursor()
print conn.encoding

screenshots_path = 'C:/path/to/screenshots/'

screenshots_dir = os.listdir(screenshots_path)
for file in screenshots_dir:
    if file != 'Thumbs.db':
        img = Image.open(screenshots_path + file)
        img256 = img.convert('P', palette=Image.ADAPTIVE, colors=5)
        colors = img256.getcolors()
        color_str = ','.join(str(v) for v in colors)

        cur.execute("UPDATE screenshots \
        set color_palette = %s \
        WHERE filename like %s", \
        (color_str, '%' + 'screenshots/' + file + '%',))
        conn.commit()

cur.close()
conn.close()

然而,当它到达curaçao(或任何其他有口音的国家等)时会出现以下错误,

Traceback (most recent call last):
  File "get_color.py", line 39, in <module>
    cur.execute("UPDATE screenshots set color_palette = %s WHERE filename like %
s", (color_str, '%' + 'screenshots/' + file + '%',))
psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0xe7 0x61 0x6f

检索和打印的实际文件名是:

curaτao.png

系统编码:

import sys
print sys.getdefaultencoding()
returns ascii

确认数据库编码:

print conn.encoding
returns UTF8

我认为我需要将文件名与数据库文件名相同的格式/编码,以便可以比较两个字符串。

我正在努力研究如何获得等效性,以便可以使用WHERE子句。

我已经搜索过其他几十个SO问题和网页,我不清楚需要做什么。

我已尝试重置默认编码

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')  (with 'latin1', Cp1252, etc)

我将数据从数据库中删除为csv,然后使用UTF-8编码和重新导入的csv数据重新创建数据库。

在使用.encode('utf-8')之前,我试图将u'附加到文件名。

我错过了什么?

0 个答案:

没有答案