SQL запрос генерирует неопределенную карту - PullRequest
2 голосов
/ 28 января 2020

Это код, который я запускаю, команда SELECT в базе данных Firebird.

Я хочу sh записать содержимое определенной таблицы в файл .txt:

import fdb
con = fdb.connect(dsn=defaultDSN, user=defaultUser, password=defaultPassword)
cur = con.cursor()

cur.execute("SELECT * FROM TableName")

#I'm aware this erases everything in the file, this is intended
file = open(file="FirebirdMirror.txt", mode="w+", encoding='utf-8', errors='ignore')
file.write('')

file = open(file="FirebirdMirror.txt", mode="a+", encoding='utf-8', errors='ignore')

for fieldDesc in cur.description:
    file.write(fieldDesc[fdb.DESCRIPTION_NAME] + ', ')

file.write("\n")

for x in list(list(str(cur.fetchall()))):
    for y in x:
        file.write(str(y) + ', ')
    file.write('\n')


file.close()

Понятия не имею, почему, но мой cur.fetchall () возвращает что-то чужое ...

Traceback (most recent call last):
  File "C:/Users/graciele.davince/PycharmProjects/helloworld/venv/firebirdSQL.py", line 205, in <module>
    generate_text_file()
  File "C:/Users/graciele.davince/PycharmProjects/helloworld/venv/firebirdSQL.py", line 166, in generate_text_file
    for x in list(list(str(cur.fetchall()))):
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3807, in fetchall
    return [row for row in self]
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3807, in <listcomp>
    return [row for row in self]
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3542, in next
    row = self.fetchone()
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3759, in fetchone
    return self._ps._fetchone()
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3412, in _fetchone
    return self.__xsqlda2tuple(self._out_sqlda)
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 2843, in __xsqlda2tuple
    value = b2u(value, self.__python_charset)
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 486, in b2u
    return st.decode(charset)
  File "C:\Users\graciele.davince\AppData\Local\Programs\Python\Python38-32\lib\encodings\cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 3234: character maps to <undefined>

В моей базе данных могут быть определенные символы бразильского португальского, а именно:

ç, â, ê, ô, ã, õ, á, é, í, ó, ú, à и их заглавные двоюродные братья.

Из того, что я гуглил, это как-то связано с тем, как текст хранится в виде битов, а символ, представленный битом 0x9d, кажется, является проблемой .

Я использую ошибки = 'игнорировать', но ошибка все еще появляется, используя кодировку = 'utf-8', и я также пробовал latin-1, ISOnumbersnumbers, windows1252 и некоторые другие, но нет безрезультатно.

  • Ограничения: Я не могу использовать какие-либо команды, которые изменяют содержимое моей таблицы, и мне обязательно нужно хранить все внутри нее в текстовом файле .txt.

пс .: столбцы в одной строке должны быть разделены запятыми, а каждая строка должна быть разделена \ n


edit .:

Решение Марка сработало, но я хотел бы добавить, что неплохо проверить, на каком диалекте находится ваша база данных.

1 Ответ

2 голосов
/ 29 января 2020

Ошибка возникает при взаимодействии с Firebird, а не при чтении из вашего текстового файла, поэтому инструкция errors="ignore" не применяется.

Возможно, вам необходимо явно указать набор символов подключения (например, UTF8) поэтому FDB не использует набор символов подключения NONE, который применяет кодировку по умолчанию (Cp1252 в вашем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...