MYSQLdb/Python - 字符串格式化时参数未全部转换错误?

0 投票
3 回答
2222 浏览
提问于 2025-05-01 15:25

我在从数据库中选择一些信息时,有一个数据库管理类,结构是这样的:

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

        self.cursor = self.connection.cursor()

当我尝试像这样进行选择操作时:

    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)
);
暂无标签

3 个回答

-1

你最好用这样的写法:

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

因为request.apikey可以自动转换成字符串。

1

这是因为执行的第二个参数需要是一个可迭代的对象,也就是说,它可以被逐个取出。这样的话,使用列表、集合或者元组会更合适。

你可以试试这个:

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

你应该直接使用元组,不需要把字符串解析成其他格式。

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

撰写回答