2010-02-27 8 views
16

Il mio database sqlite3 contiene un vincolo di colonna "fascicolata". L'ho inserito nello schema per la tabella, per evitare di trascurare accidentalmente di utilizzare le regole di confronto necessarie. Tuttavia questo significa che quando si esegue sqlite3 dalla riga di comando e non dal mio codice Python, le regole di confronto a cui si fa riferimento nello schema non sono presenti e non sono in grado di utilizzare i comandi punto.Esegui i comandi sqlite3 "punto" da Python o registra le regole di confronto nell'utilità della riga di comando

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

Inoltre, la creazione della connessione da Python, e aggiungendo il confronto richiesto corre in questo problema:

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

La funzione execute sembrerebbe non vuole passare il comando sqlite3 dot attraverso.

Come è possibile eseguire comandi punto sqlite3 quando non sono presenti le funzioni di confronto necessarie? In alternativa, come posso eseguire i comandi sqlite3 dot da Python?

risposta

6

È possibile caricare nuove sequenze e funzioni di fascicolazione utilizzando la funzione SQLite incorporata load_extension() o il comando .load nella shell della riga di comando per SQLite. Ovviamente, le estensioni devono essere scritte in C.

E non si possono chiamare i comandi punto da python, perché i comandi punto sono specifici per lo strumento shell della riga di comando.

7

I comandi punto sono disponibili solo per l'eseguibile sqlite3. Dovrai sostituirli con la combinazione equivalente di codice Python e chiamate DB-API per simulare il loro comportamento.

+1

Alcuni comandi sembrano lontani da banali. Come aggiungerebbe intestazioni o scegliere il separatore di colonne? –

8

Il comando .import nella shell sqlite è un comando incorporato. Viene elaborato dal programma shell, non dal motore SQL, quindi non è possibile eseguirlo come un'istruzione SQL.

codice di lettura per SQLite di shell.c, sembra che .import è semplicemente un ciclo, la lettura righe dal file di dati, la scissione sul separatore, e passando i campi come valori dei parametri a un preparato INSERT dichiarazione. Quindi dovresti essere in grado di simulare facilmente il comportamento di .import con codice Python.

ho provato quanto segue con 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

Un'ottima risposta alla metà della mia domanda :) –

+0

Risposta/esempio perfetto per aiutare chiunque inizi a programmare SQLite in Python! – Blairg23

0

È possibile chiamare comandi punto da Python utilizzando il modulo sottoprocesso, che richiama fondamentalmente un guscio. Se è necessario utilizzare più comandi punto, è possibile passarli come argomenti separati della shell: l'utilizzo di un punto e virgola per separarli non funzionerà.

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