2016-01-22 14 views
6

Sto usando python3 e panda di connettersi ad alcuni database SQL:Python mysql-connector converte alcune stringhe in ByteArray

import pandas as pd 
import mysql.connector 

cnx = mysql.connector.connect(user='me', password='***', 
          host='***', 
          database='***') 
df=pd.read_sql("select id as uid,refType from user where registrationTime>=1451606400",con=cnx) 
cnx.close() 

sto ottenendo 2 colonne: id e refType, entrambi sono di tipo stringa (varchar nella terminologia SQL). Tuttavia, per qualche motivo, refType colonna viene correttamente importata come stringa, ma la colonna uid viene importata come bytearray. Questo è il loro aspetto:

df.head() 
           uid 

0 [49, 54, 54, 57, 55, 54, 50, 55, 64, 97, 110]
1 [49, 54 , 54, 57, 55, 54, 50, 56, 64, 105, 111]
2 [49, 48, 49, 53, 51, 50, 51, 50, 57, 53, 57, 5 ...
3 [57, 53, 52, 52, 56, 57, 56, 56, 49, 50, 57, 5 ...
4 [49, 54, 54, 57, 55, 54, 50, 57, 64 , 105, 111]

          refType 

0 adx_Facebook.IE_an_ph_u8 _-. Cc-ch.gf.au-ret7.c ...
1 adx_Facebook.IE_io_ph_u4 _-. Cc-gb.gf.au-toppay ...
2 ad_nan_1845589538__CAbroadEOScys_- .cc-ca.gf.a ...
3 ad_offerTrialPay-DKlvl10-1009
4 adx_Facebook.IE_io_ph_u4 _-. cc-us.gf.au-topspe ...

Ed è così uid colonna dovrebbe guardare:

[i.decode() for i in df['uid'][1:5]] 

[ '16.697.628 @ io', '10153232959751867 @ fb', '954.489.881.295.911 @ fb', '16.697.629 @ io']

non capisco né perché è stato convertito in ByteArray né come scegliere di convertirlo in stringa. Non ho trovato nulla a riguardo o domande simili nella documentazione di internet o di panda. Ovviamente, posso sempre convertire quella colonna in stringa dopo l'importazione, ma non è preferibile, perché la query sql mostrata è solo un esempio, e nella tabella reale ci possono essere centinaia di colonne che potrebbero essere importate erroneamente come bytearrays. Sarebbe vero rompicoglioni per trovare manualmente le colonne e convertire in stringa

Il connettore stesso emette lo stesso ByteArray:

cursor = cnx.cursor() 
cursor.execute('select id as uid,refType from user where registrationTime>=1451606400 LIMIT 1') 
cursor.fetchall()` 

[(ByteArray (b'16697627 @ un '), 'adx_Facebook.IE_an_ph_u8 _-. cc-ch.gf.au-ret7.cr-cys.dt-all.csd-291215.-'

i tipi di dati delle colonne di database SQL) sono "Varchar (32) "per la prima colonna (uid) e" Varchar (128) "per la seconda (refType)

+0

Forse un problema con mysql.connector. Vedi https://dev.mysql.com/doc/relnotes/connector-python/en/news-2-0-0.html.Puoi mostrare quale sia il valore di ritorno da un semplice execute/fetch: 'cursor = cnx.cursor(); cursor.execute ('SELECT ... LIMIT 1'); cursor.fetchall() '? – joris

+0

hai ragione, il connettore fornisce anche '[(bytearray (b'16697627 @ an '),' adx_Facebook.IE_an_ph_u8 _-. Cc-ch.gf.au-ret7.cr-cys.dt-all.csd-291215. - ') ' –

+1

Puoi provare a utilizzare SQLAlchemy? (crea un motore e passa questo a 'read_sql' invece di' cnx') – joris

risposta

0

Questo è davvero strano. Mi chiedo se passare il parametro "coerce_float = False" alla funzione read_sql possa essere d'aiuto per questa situazione.

+0

Ho provato che, nulla cambia –

Problemi correlati