J'ai un problème d'exécution de certains SQL à partir de Python, alors que des SQL similaires fonctionnent bien à partir de l'interface utilisateur. mysql
en ligne de commande.
Le tableau se présente comme suit :
mysql> SELECT * FROM foo;
+-------+-----+
| fooid | bar |
+-------+-----+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
+-------+-----+
4 rows in set (0.00 sec)
Je peux exécuter la requête SQL suivante à partir de la ligne de commande mysql, sans problème :
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)
Cependant, lorsque j'essaie de faire la même chose à partir de Python, je n'obtiens aucune ligne, alors que je m'attendais à 2 lignes :
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)
# ()
La question est donc la suivante : comment modifier le code python pour sélectionner ces fooid
où bar
est en ('A','C')
?
Au fait, j'ai remarqué que si j'échange les rôles de bar
y fooid
je peux obtenir le code pour sélectionner ceux bar
où fooid
est en (1,3)
avec succès. Je ne comprends pas pourquoi une de ces requêtes (ci-dessous) fonctionne, alors que l'autre (ci-dessus) ne fonctionne pas.
sql='SELECT bar FROM foo WHERE fooid IN %s'
args=[[1,3]]
cursor.execute(sql,args)
data=cursor.fetchall()
print(data)
# (('A',), ('C',))
Et juste pour être absolument clair, c'est comme ça que la foo
a été créé :
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
Modifier : Lorsque j'active le journal général des requêtes avec mysqld -l /tmp/myquery.log
Je vois.
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
En effet, on dirait que trop de guillemets sont placés autour de A
y C
.
Grâce au commentaire de @Amber, je comprends mieux ce qui ne va pas. MySQLdb convertit l'argument paramétré ['A','C']
a ("'A'","'C'")
.
Existe-t-il un moyen d'effectuer une requête paramétrée en utilisant la fonction IN
Syntaxe SQL ? Ou faut-il construire manuellement la chaîne SQL ?