只有部分长字符串使用pandas write_frame写入数据库

时间:2013-11-27 05:51:31

标签: python mysql pandas dataframe

我正在将一个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']})

1 个答案:

答案 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')