2016-01-22 9 views
6

Używam python3 i pandy, aby połączyć się z jakimś bazy danych SQL:Python mysql-connector przekształca niektóre ciągi w tablicaBitowa

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() 

Dostaję 2 kolumny: id i refType, obie z nich są typu string (varchar w terminologii SQL). Jednak z jakiegoś powodu kolumna refType jest poprawnie importowana jako ciąg znaków, ale kolumna uid jest importowana jako bytearray. to ich wygląd:

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 ...

I to jest jak UID kolumna ma wyglądać:

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

[ '16697628 @ IO', '10153232959751867 @ fb', '954489881295911 @ fb', '16697629 @ IO']

Nie rozumiem, dlaczego nie został on przekształcony na tablicaBitowa ani jak aby przekonwertować go na ciąg. Nie mogłem znaleźć nic na ten temat lub podobnych pytań w dokumentacji internetowej lub pandy. Oczywiście, zawsze mogę przekonwertować tę kolumnę na ciąg po zaimportowaniu, ale to nie jest preferowane, ponieważ pokazane zapytanie sql jest tylko przykładem, aw prawdziwej tabeli mogą być setki kolumn, które zostałyby niepoprawnie zaimportowane jako bytearrays. Byłoby to prawdziwy wrzód na dupie, aby ręcznie znaleźć te kolumny i przekonwertować ciąg

Samo złącze wyprowadza sam ByteArray:

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

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

typy danych kolumn w bazie danych SQL są „VARCHAR (32) "dla pierwszej kolumny (uid) i" Varchar (128) "dla drugiej kolumny (refType)

+0

Prawdopodobnie problem z mysql.connector. Zobacz https://dev.mysql.com/doc/relnotes/connector-python/en/news-2-0-0.html.Czy możesz pokazać, jaka jest zwracana wartość z prostego wykonywania/pobierania: 'cursor = cnx.cursor(); cursor.execute ("WYBIERZ ... LIMIT 1"); cursor.fetchall() '? – joris

+0

masz rację, złącze również daje '[(bytearray (b'16697627 @ an '),' adx_Facebook.IE_an_ph_u8 _-. Cc-ch.gf.au-ret7.cr-cys.dt-all.csd-291215. - ') ' –

+1

Czy możesz spróbować użyć SQLAlchemy? (stwórz silnik i przekaż go do 'read_sql' zamiast' cnx') – joris

Odpowiedz

0

To naprawdę dziwne. Zastanawiam się, czy przekazanie parametru "coerce_float = False" do funkcji read_sql pomogłoby w tej sytuacji.

+0

Próbowałem, nic się nie zmienia –

Powiązane problemy