【问题标题】:Add new user to Wordpress using Python and MySQLdb使用 Python 和 MySQLdb 将新用户添加到 Wordpress
【发布时间】:2015-02-16 16:51:19
【问题描述】:

我正在尝试从 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,但新用户不在数据库中。我的错误在哪里?

【问题讨论】:

    标签: python wordpress mysql-python


    【解决方案1】:

    您需要在插入操作后提交并关闭数据库连接。 假设 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

    【讨论】:

      【解决方案2】:

      您似乎还没有提交交易。 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)
      

      MySQLdb.connectdb 参数替换了您的 USE 语句,with 上下文管理器负责事务。如果with块内部抛出异常,事务将回滚;否则,它将在with 块结束时提交。我更详细地讨论了这种使用 MySQLdb 进行事务管理的方法in another answer

      当然,您的最终代码看起来会有所不同,但出于测试目的,上述代码应该可以正常工作。我唯一的其他建议是,尝试使用比cmd1 更有意义的名称。我喜欢将我的 SQL 语句视为常量,因此我可能会将其命名为 INSERT_USER;重要的是要清晰一致。

      【讨论】:

        猜你喜欢
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        相关资源
        最近更新 更多