查询在phpmyadmin上执行,但不在python脚本中执行

时间:2019-05-04 21:01:35

标签: python mysql

该语句是经过设置的,以便当一条记录已经存在时,它不会添加记录,否则,它会添加一条记录。

我尝试更改查询,即使我没有发现任何问题。 我让脚本在python上运行,并打印执行的查询。然后,我将查询粘贴到phpmyadmin中,并在其中成功执行。 我还仔细检查了所有参数。

查询(空白参数):

INSERT INTO users (uname,pass) SELECT * FROM (SELECT '{}','{}') AS tmp WHERE NOT EXISTS(SELECT uname FROM users WHERE uname = '{}') LIMIT 1;

查询(填写参数):

INSERT INTO users (uname,pass) SELECT * FROM (SELECT 'john_doe','password') AS tmp WHERE NOT EXISTS(SELECT uname FROM users WHERE uname = 'john_doe') LIMIT 1;

Python脚本(重要部分)

    if action == "add_user":
        username = form.getvalue('username')
        password = form.getvalue('password')
        query = """
        INSERT INTO users (uname,pass) SELECT * FROM
        (SELECT '{}','{}') AS tmp WHERE NOT EXISTS(SELECT uname FROM users WHERE uname = '{}') LIMIT 1;
        """.format(username, password, username)
        mycursor.execute(query)

我知道几件事。

  1. 数据库连接没有问题。
  2. 参数不为空(例如username =“ john_doe”&password =“ secret”)
  3. 查询实际上在该特定表中执行。
  4. 该查询似乎会添加一条记录,然后直接将其删除(因为AUTO_INCREMENT每次都会增加,即使python脚本执行且未添加任何内容)
  5. 尝试except不会执行任何操作,因为mysql.connector.Error不会报告任何错误(这很明显,因为查询实际上已成功执行)

phpMyAdmin的实际示例: (为了显示结果表而删除了INSERT INTO部分)

第一次输入查询(例如,在查询上方)时,将生成一个表,其中两个值都作为列名作为列值。
表输出的屏幕截图:http://prntscr.com/nkgaka

一旦输入该结果,下一次您将尝试插入它时,它将仅导致仅列名,而没有值。这意味着它将不插入任何内容,因为没有插入内容,因为没有实际值。
表输出的屏幕截图:http://prntscr.com/nkgbp3

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果要确保表中的任何字段都是唯一的,请将该字段设置为PRIMARY KEYUNIQUE KEY。在这种情况下,您希望name是唯一的。

CREATE UNIQUE INDEX name ON users(name)

使用此功能,您只需INSERT。如果发生重复的密钥错误,则名称已经存在。

为避免SQL注入,请勿使用"""SELECT {}""".format。它将容易受到SQL注入的攻击。<​​/ p>

也永远不要存储纯文本密码。盐渍的哈希至少。已经有很多框架可以很好地做到这一点,因此您无需发明自己的框架。