2010-02-27 7 views
16

Ma base de données sqlite3 contient une contrainte de colonne "collate". Je l'ai placé dans le schéma de la table, pour éviter de négliger accidentellement d'utiliser la collation nécessaire. Cela signifie toutefois que lorsque vous exécutez sqlite3 à partir de la ligne de commande, et non à partir de mon code Python, le classement référencé dans le schéma n'est pas présent et que je ne peux pas utiliser les commandes dot.Exécuter des commandes "point" sqlite3 à partir de Python ou enregistrer le classement dans l'utilitaire de ligne de commande

sqlite> .import data.txt table_name 
Error: no such collation sequence: my_collation 

En outre, la création de la connexion à partir de Python, et en ajoutant la collation nécessaire se heurte à ce problème:

connWithCollation.execute(".import data.txt table_name") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: near ".": syntax error 

La fonction execute il semble ne veut pas passer la commande de point sqlite3 par. Comment puis-je exécuter des commandes point sqlite3 lorsque les fonctions de classement nécessaires ne sont pas présentes?

Sinon, comment puis-je exécuter des commandes dot sqlite3 à partir de Python?

Répondre

6

Vous pouvez charger de nouvelles séquences et fonctions d'assemblage à l'aide de la fonction SQLite intégrée load_extension() ou de la commande .load dans l'interpréteur de commandes en ligne pour SQLite. Évidemment, les extensions doivent être écrites en C.

Et vous ne pouvez pas appeler les commandes de point de Python, parce que les commandes de point sont spécifiques à l'outil de ligne de commande.

7

Les commandes point ne sont disponibles que pour l'exécutable sqlite3. Vous devrez les remplacer par la combinaison équivalente de code Python et d'appels DB-API afin d'imiter leur comportement.

+1

Certaines commandes semblent loin de trivial. Comment ajouter des en-têtes ou choisir le séparateur de colonnes? –

8

La commande .import dans le shell sqlite est une commande intégrée. Il est traité par le programme shell, pas par le moteur SQL, donc vous ne pouvez pas l'exécuter comme une instruction SQL.

un code de lecture pour shell.c de SQLite, il semble que .import est simplement une boucle, la lecture des lignes à partir du fichier de données, le fractionnement sur le séparateur, et le passage des champs en tant que valeurs de paramètres à une instruction INSERT préparé. Donc, vous devriez être capable d'imiter le comportement de .import avec du code Python facilement.

J'ai testé ce qui suit avec Python 2.6:

import sqlite3 
import csv 

conn = sqlite3.connect(':memory:') 

conn.execute('create table mytable (col1 text, col2 text, col3 text)') 

csvReader = csv.reader(open('mydata.csv'), delimiter=',', quotechar='"') 

for row in csvReader: 
     conn.execute('insert into mytable (col1, col2, col3) values (?, ?, ?)', row) 

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

Une bonne réponse à la moitié de ma question :) –

+0

Une réponse parfaite/un exemple pour aider les débutants en programmation SQLite en Python! – Blairg23

0

Vous pouvez appeler des commandes de point de Python à l'aide du module de sous-processus, qui invoque essentiellement une coquille. Si vous devez utiliser plusieurs commandes de points, vous pouvez les passer en tant qu'arguments de shell distincts. L'utilisation d'un point-virgule pour les séparer ne fonctionnera pas.

import subprocess 
subprocess.call(["sqlite3", "xxx.db", 
    ".mode tabs", 
    ".import file.tsv table_name"]) 
Questions connexes