我已经从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')
我已经在数据库中包含除了类别之外的所有列的表,所以我只需要将列添加到表中。从这些,
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
我认为数据类型中缺少一些东西,请帮我解决这个问题,谢谢。
答案 0 :(得分:2)
您无法在一个步骤中将数据添加到您的表中。您必须至少使用两个单独的语句来执行DDL(ALTER TABLE
)和DML秒(UPDATE
或INSERT ... ON DUPLICATE KEY UPDATE
)。
这意味着要添加具有NOT NULL
约束的列,需要三个步骤:
NOT NULL
约束添加到列或者,通过使用&#34;虚拟&#34;默认值,您可以分两步完成(请注意不要留下任何&#34;虚拟&#34;值浮动,或使用有意义/有充分记录的值):
NOT NULL DEFAULT ''
(或使用例如0
表示数字类型)您可以选择再次更改表格以删除DEFAULT
值。就个人而言,我更喜欢第一种方法,因为它不会在您的表中引入无意义的值,如果第二步有问题,它更有可能抛出错误。当一个列适合某个自然的DEFAULT
值时,我可能使用第二种方法,并且我打算将其保留在最终的表定义中。
此外,您没有正确参数化您的查询;你应该将参数值传递给方法而不是格式化方法调用中的字符串参数。换句话说:
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!