Python 执行数据库查询时会给出;TypeError:并非所有参数都在字符串格式化过程中转换;

Python 执行数据库查询时会给出;TypeError:并非所有参数都在字符串格式化过程中转换;,python,flask,Python,Flask,我试图用MySQLdb查询我的数据库,但是当我发送一个带有参数的查询时,我得到了TypeError:在字符串格式化过程中并非所有参数都被转换。我认为这与查询中的%s有关。如何修复此错误 Main.py: from flask import Flask, request from app.config import DB from app.items.items import ItemsAPI app = Flask(__name__) db = DB() app.register_bluep

我试图用MySQLdb查询我的数据库,但是当我发送一个带有参数的查询时,我得到了
TypeError:在字符串格式化过程中并非所有参数都被转换。我认为这与查询中的
%s
有关。如何修复此错误

Main.py

from flask import Flask, request
from app.config import DB
from app.items.items import ItemsAPI

app = Flask(__name__)
db = DB()

app.register_blueprint(ItemsAPI)

@app.route('/home')
def hello_world():
    return "Welcome to Omnimoda."

@app.route('/dbtest', methods=['GET'])
def hello_database():
    q_sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '%s'"
    a_sql = "omnimoda"
    test_request = db.query(q_sql, a_sql)
    result_request = test_request.fetchall()
    if (result_request is None):
        return "Database does not exist."
    else:
        return "Database exists."
from flask import Flask, request, jsonify, json, Blueprint
from app.config import DB

ItemsAPI = Blueprint('ItemsAPI', __name__)
db = DB()

@ItemsAPI.route('/items/listbycode', methods=['POST'])
def get_item_by_code():
    value = request.form['value']
    q_list_all = "SELECT * FROM item_info WHERE item_code = '%s'"
    print q_list_all
    a_list_all = (value)
    items_request = db.query(q_list_all, a_list_all)
    json_output = json.dumps(items_request.fetchall())
    return json_output
from flask import Flask
import MySQLdb

class DB:
    conn = None

    def connect(self):
        self.conn = MySQLdb.connect(host="localhost", user="user", passwd="passwd", db="test_dbase")
        self.conn.autocommit(True)

    def query(self, sql, values):
        try:
            print values
            cursor = self.conn.cursor()
            cursor.execute(sql)
        except (AttributeError, MySQLdb.OperationalError):
            self.connect()
            cursor = self.conn.cursor()
            cursor.execute(sql)
        return cursor
Items.py

from flask import Flask, request
from app.config import DB
from app.items.items import ItemsAPI

app = Flask(__name__)
db = DB()

app.register_blueprint(ItemsAPI)

@app.route('/home')
def hello_world():
    return "Welcome to Omnimoda."

@app.route('/dbtest', methods=['GET'])
def hello_database():
    q_sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '%s'"
    a_sql = "omnimoda"
    test_request = db.query(q_sql, a_sql)
    result_request = test_request.fetchall()
    if (result_request is None):
        return "Database does not exist."
    else:
        return "Database exists."
from flask import Flask, request, jsonify, json, Blueprint
from app.config import DB

ItemsAPI = Blueprint('ItemsAPI', __name__)
db = DB()

@ItemsAPI.route('/items/listbycode', methods=['POST'])
def get_item_by_code():
    value = request.form['value']
    q_list_all = "SELECT * FROM item_info WHERE item_code = '%s'"
    print q_list_all
    a_list_all = (value)
    items_request = db.query(q_list_all, a_list_all)
    json_output = json.dumps(items_request.fetchall())
    return json_output
from flask import Flask
import MySQLdb

class DB:
    conn = None

    def connect(self):
        self.conn = MySQLdb.connect(host="localhost", user="user", passwd="passwd", db="test_dbase")
        self.conn.autocommit(True)

    def query(self, sql, values):
        try:
            print values
            cursor = self.conn.cursor()
            cursor.execute(sql)
        except (AttributeError, MySQLdb.OperationalError):
            self.connect()
            cursor = self.conn.cursor()
            cursor.execute(sql)
        return cursor
config.py

from flask import Flask, request
from app.config import DB
from app.items.items import ItemsAPI

app = Flask(__name__)
db = DB()

app.register_blueprint(ItemsAPI)

@app.route('/home')
def hello_world():
    return "Welcome to Omnimoda."

@app.route('/dbtest', methods=['GET'])
def hello_database():
    q_sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '%s'"
    a_sql = "omnimoda"
    test_request = db.query(q_sql, a_sql)
    result_request = test_request.fetchall()
    if (result_request is None):
        return "Database does not exist."
    else:
        return "Database exists."
from flask import Flask, request, jsonify, json, Blueprint
from app.config import DB

ItemsAPI = Blueprint('ItemsAPI', __name__)
db = DB()

@ItemsAPI.route('/items/listbycode', methods=['POST'])
def get_item_by_code():
    value = request.form['value']
    q_list_all = "SELECT * FROM item_info WHERE item_code = '%s'"
    print q_list_all
    a_list_all = (value)
    items_request = db.query(q_list_all, a_list_all)
    json_output = json.dumps(items_request.fetchall())
    return json_output
from flask import Flask
import MySQLdb

class DB:
    conn = None

    def connect(self):
        self.conn = MySQLdb.connect(host="localhost", user="user", passwd="passwd", db="test_dbase")
        self.conn.autocommit(True)

    def query(self, sql, values):
        try:
            print values
            cursor = self.conn.cursor()
            cursor.execute(sql)
        except (AttributeError, MySQLdb.OperationalError):
            self.connect()
            cursor = self.conn.cursor()
            cursor.execute(sql)
        return cursor
回溯:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Library/Python/2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/lanceguinto/Documents/Project_Omnimoda/API/app/items/items.py", line 26, in get_item_by_code
    items_request = db.query(q_list_all, a_list_all)
  File "/Users/lanceguinto/Documents/Project_Omnimoda/API/app/config.py", line 15, in query
    cursor.execute(sql, values)
  File "build/bdist.macosx-10.10-intel/egg/MySQLdb/cursors.py", line 187, in execute
    query = query % tuple([db.literal(item) for item in args])
TypeError: not all arguments converted during string formatting
(value)
不是一个元组,它只是一个字符串。字符串是其字符的一个可数形式。所以事实上,这就好像您正在将输入字段中的字符列表传递到SQL语句中,而SQL语句只能容纳一个参数


改用
(value,)

光标。execute
需要一个列表作为其第二个参数

q_list_all = "SELECT * FROM item_info WHERE item_code = '%s'"
print q_list_all
a_list_all = (value,) #the comma makes it a list not the parens
items_request = db.query(q_list_all, a_list_all)
当你给它一根线的时候

cur.execute(qry,"MyArg") # =becomes==> cur.execute(qry,["M","y","A","r","g"])

有一点不相关,你真的应该考虑使用类似sqlalchemy的ORM

啊,你比我快了4秒…:)+1个很好的答案我得到了通常的“您的SQL语法有错误”的答案。直到我删除了
%s
周围的单引号,它才起作用。谢谢#逗号使它成为一个列表,而不是paren-这句话帮助了我。