<p>看起来你还没有提交交易。MySQLdb提供了一种通过<code>with</code>管理事务上下文的便捷方法,如下所示:</p>
<pre><code>with connection as cursor:
cursor.execute(query, parameters)
</code></pre>
<p>其中<code>connection</code>是开放数据库连接对象,<code>query</code>是参数化的SQL语句,<code>parameters</code>是用户提供的任何值。参数化SQL语句非常重要,因为它可以帮助您避免语法错误,并防止恶意SQL注入。参数化的另一个好处是,您可以在函数之外定义参数化SQL,使函数本身更易于阅读。在</p>
<p>下面是如何在<code>adduser</code>函数中实现这种方法。首先,将SQL语句重写为参数化查询:</p>
^{pr2}$
<p>我把语句放在自己的行上,这样我就可以很快地在Python源代码和MySQL Workbench或命令行之间复制和粘贴SQL。您可以使用您喜欢的任何样式;需要注意的是,每个用户输入值都有一个<code>%s</code>占位符。<code>execute</code>函数将负责转义特殊字符、引用字符串等,因此您不必这样做。在</p>
<p>现在,功能可以简单得多:</p>
<pre><code>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)
</code></pre>
<p><code>MySQLdb.connect</code>的<code>db</code>参数将替换您的<code>USE</code>语句,<code>with</code>上下文管理器负责处理事务。如果在<code>with</code>块内引发异常,则事务将回滚;否则,<code>with</code>块结束时将提交该异常。我将更详细地讨论这种用MySQLdb进行事务管理的方法<a href="https://stackoverflow.com/a/22618781/2359271">in another answer</a>。在</p>
<p>当然,以上代码的最终测试目的应该是不同的。我唯一的另一个建议是,尝试使用比<code>cmd1</code>更有意义的名称。我喜欢把SQL语句当作常量来处理,所以我可能会将它命名为<code>INSERT_USER</code>;重要的是要清晰一致。在</p>