2009-07-15 9 views
1

J'essaie d'écrire une requête simple à une base de données sqlite dans un script python. Pour tester si mes paramètres étaient corrects, j'ai essayé d'exécuter la requête depuis la ligne de commande ipython. Il ressemblait à quelque chose comme ceci:Pourquoi IPython ne peut-il pas retourner des enregistrements avec plusieurs champs lors de l'envoi d'une requête à sqlite?

import sqlite3 
db = 'G:\path\to\db\file.sqlite' 
conn = sqlite3.connect(db) 
results = conn.execute('SELECT * FROM studies').fetchall() 

pour une raison quelconque, mes résultats sont revenus totalement vides. Puis j'ai essayé une autre requête de test:

results = conn.execute('SELECT id FROM studies').fetchall() 

Qui a retourné correctement. J'ai pensé qu'il y avait un problème avec l'astérisque [WRONG, VOIR DEUXIÈME MISE À JOUR CI-DESSOUS], donc j'ai essayé la requête 'SELECT * FROM studies' à partir d'une ligne de commande python par défaut. Lo et voici, il est retourné correctement. J'ai essayé toutes les manières normales d'échapper à l'astérisque seulement pour être rencontré par une grande variété de messages d'erreur. Est-il possible d'exécuter cette requête dans IPython? EDIT: Désolé, j'ai incorrectement supposé IronPython et IPython étaient les mêmes. Ce que je voulais dire, c'était la ligne de commande IPython, pas le framework IronPython.


EDIT2: D'accord, il se trouve l'astérisque ne fonctionne comme le montre cette requête réussie:

'SELECT COUNT(*) FROM studies' 

Des suggestions affichées ici, il se trouve les résultats d'erreur d'essayer de retourner les enregistrements avec plusieurs champs, c'est-à-dire:

'SELECT field1,field2 FROM studies' 

qui entraîne toujours des enregistrements renvoyés. J'ai changé le titre de la question en conséquence.

Répondre

1

Ceci est SQL. IronPython a peu ou rien à voir avec le traitement de la requête. Utilisez-vous un encodage de caractères inhabituel? (IE pas UTF-8 ou ASCII)?

Qu'est-ce qui se passe si vous SELECT id,fieldname,fieldname FROM studies (En d'autres termes, simulant ce que « * » fait.)

+0

La simulation de la requête '*' n'a également renvoyé rien. Il semble que la requête ne fonctionne que lorsque je demande un champ. J'ai essayé la requête que vous avez suggérée dans la ligne de commande habituelle de Python, et j'ai obtenu la bonne réponse. Cela m'amène à croire que ironpython fait quelque chose d'un peu différemment avant que la requête SQL soit envoyée. – Francisco

+0

Si vous exécutez simplement la requête à l'invite de l'interpréteur, que dit la valeur de retour? – Christopher

0

Juste une supposition sauvage, mais s'il vous plaît essayer d'échapper antislashs dans le chemin vers le fichier de base de données.En d'autres mots au lieu de

db = 'G:\path\to\db\file.sqlite' 

essayer

db = 'G:\\path\\to\\db\\file.sqlite' 
+0

Non, pas de différence. – Francisco

1

Un peu plus de débogage, vous pouvez essayer:

s = 'SELEECT * from studies' 
print s 
conn.execute(s).fetchall() 

ou:

s = 'SELECT ' + chr(42) + ' from studies' 
conn.execute(s).fetchall() 

Vous pouvez également essayer:

conn.execute('select count(*) from studies').fetchall() 

si cela revient comme [(0,)] alors quelque chose de vraiment bizarre se passe :-)


Quelques autres choses que vous pouvez essayer:

conn.execute('select id from (select * from studies)').fetchall() 

ou:

cur = conn.cursor() 
cur.execute('select * from studies').fetchall() 
+0

Vos deux premières suggestions ne donnent aucun résultat. :( 'select count (*) from studies' renvoie le nombre correct de lignes, donc le caractère astérisque fonctionne toujours correctement.Pour l'instant, l'erreur ne se produit que lorsque j'essaie de retourner des résultats avec plus d'un champ. 'SELECT field1, field2 FROM studies' – Francisco

1

J'ai essayé toutes les choses que vous avez mentionnées dans IPython et sqlite sans aucun problème (ipython 0.9. 1, python 2.5.2).

Y at-il une chance que ce soit un problème de non-concordance de version? Peut-être que vos coquilles font référence à différentes bibliothèques?

Par exemple, est

import sqlite3; print sqlite3.version 

retour la même chose des deux coquilles (à savoir ipython et une régulière où la requête SQL fonctionne)?

Que diriez-vous

conn.execute('select sqlite_version()').fetchall() 

Est-ce que le retour de la même chose?

+0

Ma version d'ipython est également 0.9.1, mais j'utilise python 2.6.2 Les deux shells avaient une version correspondante pour les deux questions que vous avez posées, en particulier 'sqlite3.version' 2.4.1, et 'SELECT sqlite_version()' a renvoyé 3.5.9 – Francisco

Questions connexes