Pandas: to_sql UnicodeEncodeError

Criado em 1 set. 2015  ·  3Comentários  ·  Fonte: pandas-dev/pandas

gravar um dataframe em sql fornece um UnicodeEncodeError, embora sys.defaultencoding esteja definido como "utf-8" e o banco de dados mysql também esteja usando utf-8 como agrupamento padrão. Alguma ideia? Obrigado!

Em [6]: df1.to_sql (name = 'webshoptracks2', con = engine)

UnicodeEncodeError Traceback (última chamada mais recente)
no()
----> 1 df1.to_sql (nome = 'webshoptracks2', con = motor)

C: \ Python27 \ lib \ site-packages \ pandas \ core \ generic.pyc em to_sql (self, name, con,
sabor, esquema, if_exists, index, index_label, chunksize, dtype)
980 self, name, con, flavour = flavour, schema = schema, if_exists = if_
existe,
981 index = index, index_label = index_label, chunksize = chunksize,
-> 982 dtipo = dtipo)
983
984 def to_pickle (self, path):

C: \ Python27 \ lib \ site-packages \ pandas \ io \ sql.pyc em to_sql (frame, name, con, flav
ou esquema, if_exists, index, index_label, chunksize, dtype)
547 pandas_sql.to_sql (quadro, nome, if_exists = if_exists, index = index,
548 index_label = index_label, schema = schema,
-> 549 chunksize = chunksize, dtype = dtype)
550
551

C: \ Python27 \ lib \ site-packages \ pandas \ io \ sql.pyc em to_sql (self, frame, name, if_
existe, índice, index_label, esquema, tamanho do bloco, tipo d)
1186 schema = schema, dtype = dtype)
1187 table.create ()
-> 1188 table.insert (chunksize)
1189 # verificar possíveis problemas de distinção entre maiúsculas e minúsculas (GH7815)
1190 se o nome não estiver em self.engine.table_names (schema = schema ou self.met
a.schema):

C: \ Python27 \ lib \ site-packages \ pandas \ io \ sql.pyc na inserção (self, chunksize)
726
727 chunk_iter = zip (* [arr [start_i: end_i] para arr em data_li
st])
-> 728 self._execute_insert (conn, keys, chunk_iter)
729
730 def _query_iterator (self, result, chunksize, colunas, coerce_float = T
rue,

C: \ Python27 \ lib \ site-packages \ pandas \ io \ sql.pyc em _execute_insert (self, conn, k
eys, data_iter)
701 def _execute_insert (self, conn, keys, data_iter):
702 dados = [dict ((k, v) para k, v em zip (chaves, linha)) para linha em dados_
iter]
-> 703 conn.execute (self.insert_statement (), dados)
704
705 def insert (self, chunksize = None):

C: \ Python27 \ lib \ site-packages \ sqlalchemy \ engine \ base.pyc em execução (self, object
, _multiparams, * _params)
912 tipo (objeto))
913 mais:
-> 914 metanfetamina de retorno (self, multiparams, params)
915
916 def _execute_function (self, func, multiparams, params):

C: \ Python27 \ lib \ site-packages \ sqlalchemy \ sql \ elements.pyc em _execute_on_connect
íon (self, connection, multiparams, params)
321
322 def _execute_on_connection (self, connection, multiparams, params):
-> 323 retornar conexão._execute_clauseelement (self, multiparams, para
em)
324
325 def unique_params (self, _optionaldict, * _kwargs):

C: \ Python27 \ lib \ site-packages \ sqlalchemy \ engine \ base.pyc em _execute_clauseeleme
nt (self, elem, multiparams, params)
1008 compiled_sql,
1009 destilled_params,
-> 1010 compiled_sql, destilled_params
1011)
1012 se self._has_events ou self.engine._has_events:

C: \ Python27 \ lib \ site-packages \ sqlalchemy \ engine \ base.pyc em _execute_context (sel
f, dialeto, construtor, instrução, parâmetros, * args)
1144 parâmetros,
Cursor 1145,
-> 1146 contexto)
1147
1148 se self._has_events ou self.engine._has_events:

C: \ Python27 \ lib \ site-packages \ sqlalchemy \ engine \ base.pyc em _handle_dbapi_except
íon (self, e, declaração, parâmetros, cursor, contexto)
1342)
1343 mais:
-> 1344 util.reraise (* exc_info)
1345
1346 finalmente:

C: \ Python27 \ lib \ site-packages \ sqlalchemy \ engine \ base.pyc em _execute_context (sel
f, dialeto, construtor, instrução, parâmetros, * args)
Declaração 1114,
1115 parâmetros,
-> 1116 contexto)
1117 elif not parameters e context.no_parameters:
1118 se self.dialect._has_events:

C: \ Python27 \ lib \ site-packages \ sqlalchemy \ dialects \ mysql \ mysqldb.pyc em do_execut
emany (self, cursor, instrução, parâmetros, contexto)
93
94 def do_executemany (self, cursor, statement, parameters, context = None
):
---> 95 rowcount = cursor.executemany (instrução, parâmetros)
96 se o contexto não for Nenhum:
97 context._rowcount = rowcount

C: \ Python27 \ lib \ site-packages \ pymysql \ cursors.pyc em executemany (self, query, ar
gs)
153 return self._do_execute_many (q_prefix, q_values, q_postfix,
args,
154 self.max_stmt_length,
-> 155 self._get_db (). Codificação)
156
157 self.rowcount = sum (self.execute (query, arg) para arg em args)

C: \ Python27 \ lib \ site-packages \ pymysql \ cursors.pyc em _do_execute_many (self, pref
ix, valores, postfix, args, max_stmt_length, codificação)
179 if isinstance (v, text_type):
180 se PY2:
-> 181 v = v.encode (codificação)
182 mais:
183 v = v.encode (codificação, 'surrogateescape')

UnicodeEncodeError: o codec 'latin-1' não pode codificar caracteres na posição 433-438:
ordinal fora do intervalo (256)

IO SQL

Comentários muito úteis

Obrigado! Adicionar '? Charset = utf8' à chamada create_engine () resolveu o problema.

Todos 3 comentários

Você tentou configurar o objeto engine também? Consulte http://docs.sqlalchemy.org/en/rel_1_0/core/engines.html#engine -creation-api

E você pode fornecer um exemplo reproduzível? (um pequeno dataframe que apresenta esse erro)

Obrigado! Adicionar '? Charset = utf8' à chamada create_engine () resolveu o problema.

Esta página foi útil?
0 / 5 - 0 avaliações