python2.7 - python 如何执行mysql单个参数过滤
高洛峰
高洛峰 2017-04-18 10:22:21
0
2
782

使用python执行mysql,报错了:

name = "AAA'A"
cursor.execute('select * from tb where name=%s',name)
cursor.execute('select * from tb where name=%s',(name))

都会报错

query = query % tuple([db.literal(item) for item in args])
TypeError: not all arguments converted during string formatting

但是以下不会报错:

name = "AAA'A"
cursor.execute('select * from tb where name=%s and %s',(name,1))

python27 如何过滤mysql 单个参数

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
小葫芦

質問者はデータベースへの接続にどのライブラリが使用されているかについて言及していないため、mysqldb を使用していると想定されます。 mysqldb
可以看一下mysqldb的源码:

...
def execute(self, query, args=None):
    """
    ...
    args -- optional sequence or mapping, parameters to use with query.
    ...
    """
    if args is not None:
        # 首先判断args是否为字典类型
        if isinstance(args, dict):
            # 以k-v形式填入查询语句中。
            query = query % dict((key, db.literal(item))
                                 for key, item in args.iteritems())
        # 当args为非字典类型时
        else:
            # 遍历args, 最后生成一个元组填入查询语句中。
            query = query % tuple([db.literal(item) for item in args])
    ...

可以看到,args参数为一个可选的序列或者映射,即args参数的期望类型是list或者tuple mysqldb のソース コードをご覧ください:
リーリー

args パラメーターがオプションのシーケンスまたはマッピングであることがわかります。つまり、args パラメーターの予期されるタイプは list または tuple です。

次に、指定した入力パラメータを振り返ってください:

リーリー

したがって、解決策は簡単です:
リーリー

これには小さな詳細が含まれます。 🎜要素が 1 つだけあるタプルを作成する場合は、コンマを追加する必要があります。追加しないと、インタープリターによって文字列として作成されます。 🎜
いいねを押す +0
阿神

リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート