我正在将一个pandas DataFrame
写入MySql
数据库。以下是它在屏幕上的显示方式。
IP Agent
0 108.225.156.214 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) G...
1 125.214.169.32 Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaN8-0...
2 125.214.169.32 Mozilla/5.0 (compatible; MSIE 9.0; Windows Pho...
我将带有用户代理字符串的DataFrame
写入数据库,如下所示。
db = MySQLdb.connect("host","user","","db")
cursor = db.cursor()
cursor.execute("DROP TABLE IF EXISTS Pattern")
sql.write_frame(df, con=db,name = 'Pattern',flavor='mysql')
db.close()
问题是只有用户代理字符串的第一部分写入数据库?(就像屏幕上显示的那样)。怎么避免这个?
更新
示例DataFrame:
df = pd.DataFrame({'IP':['108.225.156.214','141.0.8.111','94.174.16.147'],'UserAgent':['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13','Mozilla/5.0 (Linux; Android 4.1.2; GT-I9300T Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31','Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.28684/29.3530; U; en) Presto/2.8.119 Version/11.10']})
答案 0 :(得分:1)
当您手动删除表时(可以使用recreate=True
param获得相同的行为),似乎原因在于创建语句,对于您的情况生成为
CREATE TABLE pattern (
`IP` VARCHAR (63),
`UserAgent` VARCHAR (63)
);
此处63
是来自pandas.io.sql.get_sqltype
我认为解决方案是预先创建具有所需结构的表格,例如
CREATE TABLE pattern (
`IP` VARCHAR (15),
`UserAgent` VARCHAR (1000));
并且不使用drop
语句来证明它(从dba的角度来看这是一个不好的做法),但是使用delete from pattern
语句。
为了进一步使用,我将在这里添加用于检查生成的SQL的简单模拟连接类:
class MockConnection(object):
def __init__(self):
self.query = []
def executemany(self, *args):
self.query.append(args)
def cursor(self):
return self
def execute(self, *args):
self.query.append(args)
def close(self): pass
def commit(self): pass
用法如下:
>>> con = MockConnection()
>>> pd.io.sql.write_frame(df, 'test', con, flavor ='mysql')