【问题标题】:MYSQLdb/Python - not all arguments converted during string formatting error?MYSQLdb/Python - 不是在字符串格式化错误期间转换的所有参数?
【发布时间】:2014-11-04 19:14:44
【问题描述】:

试图从数据库中选择一些信息,我有一个如下所示的数据库管理器类:

class DatabaseManager:
    def __init__(self):
        self.connection = MySQLdb.connect(host="localhost", 
                     user="neal", 
                      passwd="hacker123",
                      db="massive") 

        self.cursor = self.connection.cursor()

当尝试执行这样的 SELECT 时:

    db = DatabaseManager()
    db.cursor.execute("SELECT password FROM USERS WHERE apikey = %s", str(request.apikey))

我得到一个

TypeError: not all arguments converted during string formatting

这很奇怪,因为我在其他地方也有类似的查询,但效果很好,比如这个:

db.cursor.execute('''INSERT into USERS(email, username, password, apikey) values (%s, %s, %s, %s)''',
    (request.email, request.username, request.password, apikey))

我做错了吗?

编辑:列混乱,表格如下所示:

CREATE TABLE users (
id int NOT NULL AUTO_INCREMENT, 
email varchar(255) NOT NULL,
username varchar(25) NOT NULL,
password varchar(25) NOT NULL,
apikey varchar(45) NOT NULL,
PRIMARY KEY (id),
UNIQUE(email),
UNIQUE(username),
UNIQUE(apikey)
);

【问题讨论】:

  • 您是否尝试将参数作为带有单个字符串的 tu9le 传递?

标签: python mysql string mysql-python


【解决方案1】:

那是因为second argument of execute is an iterable。因此,最好使用列表、集合或元组。

试试这个:

db.cursor.execute("SELECT password FROM USERS WHERE apikey = %s", (str(request.apikey),))

【讨论】:

    【解决方案2】:

    你应该给元组,不需要解析str;

    db.cursor.execute("SELECT password FROM USERS WHERE apikey = %s", (request.apikey,))
    

    【讨论】:

      【解决方案3】:

      这样你会好很多:

      db.cursor.execute("SELECT password FROM USERS WHERE apikey = {0}".format(str(request.apikey)))

      鉴于 request.apikey 可以隐式转换为字符串

      【讨论】:

      • 当我这样做时,我得到这个错误:File "/Library/Python/2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler OperationalError: (1054, "Unknown column 'a443160d' in 'where clause'")。 API 密钥的格式为a443160d-66fb-482c-953b-af1349b9c5ba,列名为 apikey。为什么它认为我传递的值是列名?
      • 如果 apikey 值为字符串,则包含引号(')。如果它是一个整数应该没问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多