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

使用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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(2)
小葫芦

Memandangkan penyoal tidak menyebut perpustakaan mana yang digunakan untuk menyambung ke pangkalan data, andaikan anda menggunakan mysqldb.
Anda boleh melihat kod sumber 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])
    ...

Seperti yang anda lihat, parameter args ialah jujukan atau pemetaan pilihan, iaitu, jenis parameter args yang dijangkakan ialah list atau tuple.
Kemudian lihat kembali pada parameter input yang anda berikan:

>>> name = 'test'
>>> type(name)
<type 'str'>
>>> type((name))
<type 'str'>
>>> type(('name', 1))
<type 'tuple'>

Jadi, penyelesaiannya mudah sahaja:

>>> type((name, ))
<type 'tuple'>
>>> cursor.execute('select * from tb where name=%s',(name, ))
1L

Perincian kecil terlibat di sini.
Apabila mencipta tuple dengan hanya satu elemen, anda perlu menambah koma, jika tidak, jurubahasa akan menciptanya sebagai rentetan.

阿神
cursor.execute('select * from tb where name="%s"',name)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan