注:本文适用于 Python 3 环境。

之前一篇博客记录了用 Psycopg2 库操作 PostgreSQL 数据库踩过的坑。本文就介绍用 Python 的另一个库 py-postgresql 操作 PostgreSQL 数据库时踩过的坑。

 

连接数据库时的编码问题

在用 py-postgresql 数据库建立连接时,同样需要指定客户端的连接编码。否则,在解码中文字符时也会抛出异常:

Traceback (most recent call last):
  File "./crawler.py", line 227, in 
	CrawlByHost(host_list['whitelist'])
  File "./crawler.py", line 212, in CrawlByHost
	ChildCrawlProcess(host_item, date)
  File "./crawler.py", line 185, in ChildCrawlProcess
	for (url, ) in cursor.fetchall():
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 37: ordinal not in range(128)

解决方法有两种:

  • 在用 postgresql.open() 方法建立连接的同时,同时通过 encoding 参数设置编码。示例代码如下:
    	_settings = {
    			'client_encoding' : 'utf8'
    			})
    	pg_conn = postgresql.open(user=_user, password=_password, host=_host, port=_port, database=_database, settings=_settings)
  • 在用 postgresql.open() 方法建立连接后(返回值类型为 postgresql.api.Connection),通过修改 postgresql.api.Connectionsettings 属性来设置编码。示例代码如下:
    	pg_conn = postgresql.open(user=_user, password=_password, host=_host, port=_port, database=_database)
    	# 下面两种方式皆可。
    	# pg_conn.settings['client_encoding'] = 'utf8'
    	pg_conn.settings.update({
    			'client_encoding' : 'utf8'
    			}))

参考链接:

Leave a Reply

Your email address will not be published. Required fields are marked *