Вы печатаете UnicodeEncodeError результаты запроса на MS SQL с помощью adodbapi - PullRequest
3 голосов
/ 17 марта 2012

Python новичок здесь.

Я использую python2.7.2 в Windows7.

Я установил расширения PyWin32 (сборка 217).

Я установилc:\Python27\Lib\site-packages\adodbapi

У меня есть очень простой модуль, который запрашивает базу данных AdventureWorks2008LT в MS SQL Server.

import adodbapi

connStr='Provider=SQLOLEDB.1;' \
    'Integrated Security=SSPI;' \
    'Persist Security Info=False;' \
    'Initial Catalog=AVWKS2008LT;' \
    'Data Source=.\\SQLEXPRESS'

conn = adodbapi.connect(connStr)

tablename = "[salesLT].[Customer]"

# create a cursor
cur = conn.cursor()

# extract all the data
sql = "select * from %s" % tablename
cur.execute(sql)

# show the result
result = cur.fetchall()
for item in result:
    print item

# close the cursor and connection
cur.close()
conn.close()

Образец базы данных AdventureWorks2008LT содержит таблицы клиентов, продуктов, адресов и заказов (и т. Д.).Некоторые из строковых данных в этих таблицах имеют Unicode.

Запрос работает, для первых пар строк .Я вижу ожидаемый результат.Но затем сценарий завершается ошибкой с таким сообщением:

Traceback (most recent call last):
  File "C:\dev\python\query-1.py", line 24, in <module>
    print item
  File "C:\Python27\lib\site-packages\adodbapi\adodbapi.py", line 651, in __str__
    return str(tuple([str(self._getValue(i)) for i in range(len(self.rows.converters))]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 19: ordinal not in range(128)

..., что очень бесполезно.Мне.

Я понял, что adodbapi пытается закодировать символ u '\ xe9' в ASCII.Я понимаю, почему это не удастся.Я полагаю, что он пытается сделать это как часть оператора print.

Почему он пытается закодировать символ в ASCII?
Как я могу сказать ему просто использовать UTF-8?

ps: я запускаю скрипт из командной строки cmd.exe в Windows.Означает ли это, что стандартный вывод всегда ASCII?

Например, \python27\python.exe -c "import sys; print(sys.stdout.encoding)"

дает мне 'cp437'

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Мне удалось запустить скрипт до конца, распечатать все извлеченные строки, изменив выходную часть, сделав так:

# show the result
result = cur.fetchall()
for item in result:
    print repr(item)

вместо этого:

# show the result
result = cur.fetchall()
for item in result:
    print item

Таким образом, проблема на самом деле заключается в использовании str в adodbapi, как сказал Бореалид в комментарии.Но это не обязательно проблема блокировки.Обычно при извлечении строк из запроса к базе данных люди не просто хотят получить строковое представление строки;они хотят получить значения в отдельных столбцах.Я пришел к выводу, что эта проблема является своего рода искусственной проблемой, из-за того, как я создавал тестовое приложение.

0 голосов
/ 17 марта 2012

Как мне сказать, чтобы он просто использовал UTF-8?

chcp 65001
...