Python MySQLdb, полное выполнение запроса на вставку, игнорирование ошибочных вставок - PullRequest
0 голосов
/ 02 июня 2018

Я читаю файл построчно, сохраняю данные, которые мне нужны, в переменных, а затем передаю их в операторе вставки для сохранения их в моей базе данных строка за строкой.Когда программа попадает на смайлик Юникод, mysql проходит через следующее исключение:

Traceback (most recent call last):
  File "import_json.py", line 73, in <module>
    crs.execute(ins_statement,parameters)
  File "/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/venv/lib/python3.4/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "/venv/lib/python3.4/site-packages/MySQLdb/cursors.py", line 374, in _do_query
    db.query(q)
  File "/venv/lib/python3.4/site-packages/MySQLdb/connections.py", line 277, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x87\\xB5\\xF0\\x9F...' for column 'primary_geo' at row 1")

До сих пор я столкнулся с несколькими проблемами с кодировкой, и я решил их, настроив кодировку mysqls на utf8mb4 следующим образом:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

, а также добавлено в мой код:

conn.set_character_set('utf8')
cursor.execute('SET NAMES utf8;')
cursor.execute('SET CHARACTER SET utf8;')
cursor.execute('SET character_set_connection=utf8;')

Однако появляются такие вещи, как смайлики Unicode, и кто знает, что еще произойдет при импорте и разборе миллионов строк,Поэтому я хотел бы разрешить cursor.execute(insert_stmnt) добавить все правильные строки и игнорировать ошибочные, поскольку мне нужно только сохранить образец моих необработанных данных.

Я пытался:

` try:
      crs.execute(insert_stmnt,args)
  except (MySQLdb.Error):
      continue`

но это просто завершает программу, ничего не записывая в мою базу данных.

1 Ответ

0 голосов
/ 02 июня 2018

Никогда не работайте, когда не высыпаетесь.Особенно, когда ты новичок, как я.Я не совершал.

try:
      crs.execute(insert_stmnt,args)
      conn.commit() 
  except (MySQLdb.Error):
      continue`
...