python3 mysqldb查询_python – 使用MySQLdb执行“SELECT … WHERE … IN …”

我有一个问题从Python执行一些SQL,尽管类似的SQL工作正常从mysql命令行。

表格如下所示:

mysql> SELECT * FROM foo;

+-------+-----+

| fooid | bar |

+-------+-----+

| 1 | A |

| 2 | B |

| 3 | C |

| 4 | D |

+-------+-----+

4 rows in set (0.00 sec)

我可以从mysql命令行执行以下SQL查询,没有问题:

mysql> SELECT fooid FROM foo WHERE bar IN ('A','C');

SELECT fooid FROM foo WHERE bar IN ('A','C');

+-------+

| fooid |

+-------+

| 1 |

| 3 |

+-------+

2 rows in set (0.00 sec)

但是,当我尝试在Python中做同样的事情时,我没有行,而我预期2行:

import MySQLdb

import config

connection=MySQLdb.connect(

host=config.HOST,user=config.USER,passwd=config.PASS,db='test')

cursor=connection.cursor()

sql='SELECT fooid FROM foo WHERE bar IN %s'

args=[['A','C']]

cursor.execute(sql,args)

data=cursor.fetchall()

print(data)

# ()

所以问题是:应该如何修改python代码来选择那些bar在(‘A’,’C’)?

顺便说一句,我注意到,如果我切换bar和fooid的角色,我可以得到代码来选择fooid在(1,3)成功的那些条。我不明白为什么一个这样的查询(下面)工作,而另一个(上面)不。

sql='SELECT bar FROM foo WHERE fooid IN %s'

args=[[1,3]]

cursor.execute(sql,args)

data=cursor.fetchall()

print(data)

# (('A',), ('C',))

只是为了绝对清晰,这是foo表的创建方式:

mysql> DROP TABLE IF EXISTS foo;

Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE `foo` (

`fooid` int(11) NOT NULL AUTO_INCREMENT,

`bar` varchar(10) NOT NULL,

PRIMARY KEY (`fooid`));

Query OK, 0 rows affected (0.01 sec)

mysql> INSERT into foo (bar) values ('A'),('B'),('C'),('D');

Query OK, 4 rows affected (0.00 sec)

Records: 4 Duplicates: 0 Warnings: 0

编辑:当我使用mysqld -l /tmp/myquery.log启用一般查询日志

我懂了

mysqld, Version: 5.1.37-1ubuntu5.5-log ((Ubuntu)). started with:

Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock

Time Id Command Argument

110101 11:45:41 1 Connect unutbu@localhost on test

1 Query set autocommit=0

1 Query SELECT fooid FROM foo WHERE bar IN ("'A'", "'C'")

1 Query SELECT bar FROM foo WHERE fooid IN ('1', '3')

1 Quit

事实上,看起来在A和C周围有太多的引号。

感谢@ Amber的评论,我更好地理解了哪里出了问题。 MySQLdb将参数化的参数[‘A’,’C’]转换为(“’A’”,“’C’”)。

有没有办法使用IN SQL语法进行参数化查询?还是必须手工构造SQL字符串?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值