我试图从Python添加新的Wordpress用户。我创建了这个函数:
def adduser(domain_ip,username,password):
db = MySQLdb.connect(host=domain_ip, user=username, passwd=password)
cur = db.cursor()
cur.execute("USE %s;" % "yogatrai")
cmd1 = """INSERT INTO `wp_users` (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`) VALUES ('5', 'demo1', MD5('demo1demo'), 'firstname lastname', 'email@example.com', '0');"""
cur.execute(cmd1)
相同的sql命令在Navicat中有效。在Python中,它返回ok,但新用户不在数据库中。我的错误在哪里?
答案 0 :(得分:0)
您需要在插入操作后提交并关闭数据库连接。
假设sql
是您的查询字符串,请执行:
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
在这里查看此示例: http://www.tutorialspoint.com/python/python_database_access.htm
答案 1 :(得分:0)
看起来您尚未承诺交易。 MySQLdb提供了一种通过with
管理事务上下文的便捷方式,如下所示:
with connection as cursor:
cursor.execute(query, parameters)
其中connection
是您的开放数据库连接对象,query
是您的参数化SQL语句,parameters
是用户提供的任何值。参数化SQL语句非常重要,因为它可以帮助您避免语法错误并保护您免受恶意SQL注入。参数化的另一个好处是您可以在函数之外定义参数化SQL,使函数本身更容易阅读。
以下是您在adduser
函数中实现此方法的方法。首先,将SQL语句重写为参数化查询:
cmd1 = """
INSERT INTO `wp_users`
(`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`)
VALUES
(%s, %s, MD5(%s), %s, %s, %s);
"""
我把声明放在自己的行上,这样我就可以在Python源代码和MySQL Workbench或命令行之间快速复制和粘贴我的SQL。你可以使用你喜欢的任何风格;需要注意的重要一点是,每个用户输入值都有一个%s
占位符。 execute
函数将负责转义特殊字符,引用字符串等,因此您不必这样做。
现在,该功能可以更加简单:
def adduser(domain_ip, username, password):
db = MySQLdb.connect(host=domain_ip, user=username, passwd=password, db="yogatrai")
args = (5, 'demo1', 'demo1demo', 'firstname lastname', 'email@example.com', 0)
with db as cur:
cur.execute(cmd1, args)
db
MySQLdb.connect
参数替换USE
语句,with
上下文管理器负责处理事务。如果在with
块内抛出异常,则事务将被回滚;否则,它将在with
块结束时提交。我更详细地讨论了使用MySQLdb进行事务管理的这种方法in another answer。
当然,您的最终代码看起来会有所不同,但出于测试目的,上述代码应该可以正常工作。我唯一的其他建议是,尝试使用比cmd1
更有意义的名称。我喜欢将我的SQL语句视为常量,因此我可能会将此命名为INSERT_USER
;重要的是要清楚和一致。