对于我的生活,我无法弄清楚为什么以下模块不会向我的数据库添加新行。我可以使用命令行界面添加它们。我也可以使用其他方法添加它们(即将命令写入脚本文件并使用os.system('...')
,但如果我使用cursor.execute()
,则不会添加任何行(即使创建了表)。是一个最小的脚本,为您的观看乐趣。请注意,我运行此脚本时没有错误或警告
#!/usr/bin/env python
import MySQLdb
if __name__ == '__main__':
db = MySQLdb.connect ( host="localhost", user="user", passwd="passwd", db="db" )
cursor = db.cursor()
cursor.execute (
"""
CREATE TABLE IF NOT EXISTS god_i_really_hate_this_stupid_library
(
id INT NOT NULL auto_increment,
username VARCHAR(32) NOT NULL UNIQUE,
PRIMARY KEY(id)
) engine=innodb;
"""
)
cursor.execute (
"""
INSERT INTO god_i_really_hate_this_stupid_library
( username )
VALUES
( 'Booberry' );
"""
)
cursor.close()
答案 0 :(得分:2)
您需要在连接上调用commit
,否则所有更改都将自动回滚。
答案 1 :(得分:2)
来自MySQLdb的FAQ:
从1.2.0开始,默认情况下,MySQLdb根据DB-API标准(PEP-249)的要求禁用自动提交。如果您使用的是InnoDB表或其他类型的事务表类型,则需要在关闭连接之前执行connection.commit(),否则您的更改都不会写入数据库。
相反,您也可以使用connection.rollback()来丢弃自上次提交以来所做的任何更改。
重要说明:某些SQL语句(特别是像CREATE TABLE这样的DDL语句)是非事务性的,因此无法回滚,并且它们会导致挂起的事务提交。
您可以致电db.autocommit(True)
打开连接自动提交,或者只要您认为有必要,只需手动拨打db.commit()
。