2010-02-27 15 views
16

Mi base de datos sqlite3 contiene una restricción de columna "intercalar". Lo coloqué en el esquema de la tabla para evitar accidentalmente dejar de usar la intercalación necesaria. Sin embargo, esto significa que al ejecutar sqlite3 desde la línea de comandos y no desde mi código de Python, la intercalación a la que se hace referencia en el esquema no está presente y no puedo usar comandos de punto.Ejecutar comandos sqlite3 "punto" de Python o registrar intercalación en la utilidad de línea de comandos

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

Por otra parte, la creación de la conexión de Python, y la adición de la colación requerida se encuentra con este 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 función execute al parecer no quiere pasar el comando sqlite3 punto través.

¿Cómo puedo ejecutar los comandos sqlite3 dot cuando las funciones de intercalación necesarias no están presentes? Alternativamente, ¿cómo puedo ejecutar comandos sqlite3 dot desde Python?

Respuesta

6

Puede cargar nuevas secuencias y funciones de clasificación utilizando la función integrada SQLite load_extension() o el comando .load en el shell de línea de comandos para SQLite. Obviamente, las extensiones se escriben en C.

Y no puede llamar a dot-commands desde python, porque los comandos de punto son específicos de la herramienta de shell de línea de comandos.

7

Los comandos dot solo están disponibles para el ejecutable sqlite3. Tendrá que reemplazarlos con la combinación equivalente de código Python y llamadas DB-API para imitar su comportamiento.

+1

Algunos comandos parecen estar lejos de ser triviales. ¿Cómo agregaría encabezados o elegiría el separador de columnas? –

8

El comando .import en el shell sqlite es un comando incorporado. Es procesado por el programa shell, no el motor SQL, por lo que no puede ejecutarlo como una instrucción SQL.

código de lectura para SQLite de shell.c, parece que .import es simplemente un bucle, la lectura de las líneas del archivo de datos, que parte en el separador, y pasando los campos como valores de parámetros a un INSERT declaración preparada. Entonces debería poder imitar el comportamiento de .import con código Python fácilmente.

I probado las siguientes 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

Una gran respuesta para la mitad de mi pregunta :) –

+0

¡Respuesta/ejemplo perfecto para ayudar a cualquiera que empiece con la programación de SQLite en Python! – Blairg23

0

Puede llamar a comandos de punto de Python usando el módulo de subproceso, que básicamente invoca un shell. Si necesita usar múltiples comandos de puntos, puede pasarlos como argumentos de shell separados; usar un punto y coma para separarlos no funcionará.

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