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)
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
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. - ') ' –
Czy możesz spróbować użyć SQLAlchemy? (stwórz silnik i przekaż go do 'read_sql' zamiast' cnx') – joris