无法将pandas数据框中的列添加到python中的mysql

时间:2015-01-16 16:29:50

标签: mysql python-2.7 pandas

我已经从python连接到mysql,我可以使用df.to_sql命令将整个数据框添加到sql。当我从pd.DataFrame添加/更新单个列时,无法使用udate / add。

以下是有关数据集,结果

的信息
In [221]: result.shape
Out[221]: (226, 5)

In [223]: result.columns
Out[223]: Index([u'id', u'name', u'height', u'weight', u'categories'], dtype='object')

我已经在数据库中包含除了类别之外的所有列的表,所以我只需要将列添加到表中。从这些,

Python MYSQL update statement

ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax

cursor.execute("ALTER TABLE content_detail ADD category VARCHAR(255)" % result["categories"])

这可以成功添加列但是包含所有NULL值, 当我尝试这个时

cursor.execute("ALTER TABLE content_detail ADD category=%s VARCHAR(255)" % result["categories"])

以跟随错误结束

ProgrammingError                          Traceback (most recent call last)
    <ipython-input-227-ab21171eee50> in <module>()
    ----> 1 cur.execute("ALTER TABLE content_detail ADD category=%s VARCHAR(255)" % result["categories"])

/usr/lib/python2.7/dist-packages/mysql/connector/cursor.pyc in execute(self, operation, params, multi)
    505             self._executed = stmt
    506             try:
--> 507                 self._handle_result(self._connection.cmd_query(stmt))
    508             except errors.InterfaceError:
    509                 if self._connection._have_next_result:  # pylint: disable=W0212

/usr/lib/python2.7/dist-packages/mysql/connector/connection.pyc in cmd_query(self, query)
    720         if not isinstance(query, bytes):
    721             query = query.encode('utf-8')
--> 722         result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
    723 
    724         if self._have_next_result:

/usr/lib/python2.7/dist-packages/mysql/connector/connection.pyc in _handle_result(self, packet)
    638             return self._handle_eof(packet)
    639         elif packet[4] == 255:
--> 640             raise errors.get_exception(packet)
    641 
    642         # We have a text result set

ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=0     corporate
1     corporate

我认为数据类型中缺少一些东西,请帮我解决这个问题,谢谢。

1 个答案:

答案 0 :(得分:2)

您无法在一个步骤中将数据添加到您的表中。您必须至少使用两个单独的语句来执行DDL(ALTER TABLE)和DML秒(UPDATEINSERT ... ON DUPLICATE KEY UPDATE)。

这意味着要添加具有NOT NULL约束的列,需要三个步骤:

  1. 添加可以为空的列
  2. 使用每行中的值填充列
  3. NOT NULL约束添加到列
  4. 或者,通过使用&#34;虚拟&#34;默认值,您可以分两步完成(请注意不要留下任何&#34;虚拟&#34;值浮动,或使用有意义/有充分记录的值):

    1. 将列添加为NOT NULL DEFAULT ''(或使用例如0表示数字类型)
    2. 使用每行中的值填充列
    3. 您可以选择再次更改表格以删除DEFAULT值。就个人而言,我更喜欢第一种方法,因为它不会在您的表中引入无意义的值,如果第二步有问题,它更有可能抛出错误。当一个列适合某个自然的DEFAULT值时,我可能使用第二种方法,并且我打算将其保留在最终的表定义中。

      此外,您没有正确参数化您的查询;你应该将参数值传递给方法而不是格式化方法调用中的字符串参数。换句话说:

      cursor.execute("Query with %s, %s, ...", iterable_with_values)  # Do this!
      cursor.execute("Query with %s, %s, ..." % iterable_with_values)  # NOT this!