Por alguna razón, no puedo encontrar una manera de obtener los equivalentes de los comandos de shell interactivos de sqlite:
.tables
.dump
usando la API Python sqlite3.
¿Hay algo por el estilo?
Por alguna razón, no puedo encontrar una manera de obtener los equivalentes de los comandos de shell interactivos de sqlite:
.tables
.dump
usando la API Python sqlite3.
¿Hay algo por el estilo?
Respuestas:
Puede obtener la lista de tablas y esquemas consultando la tabla SQLITE_MASTER:
sqlite> .tab
job snmptarget t1 t2 t3
sqlite> select name from sqlite_master where type = 'table';
job
t1
t2
snmptarget
t3
sqlite> .schema job
CREATE TABLE job (
id INTEGER PRIMARY KEY,
data VARCHAR
);
sqlite> select sql from sqlite_master where type = 'table' and name = 'job';
CREATE TABLE job (
id INTEGER PRIMARY KEY,
data VARCHAR
)
sqlite> .schema job
sintaxis no válida en python ... ¿qué me estoy perdiendo?
sqlite>
es el indicador de cliente de línea de comando sqlite. El propósito del ejemplo era demostrar cómo se podía consultar la base de datos para enumerar tablas y esquemas.
En Python:
con = sqlite3.connect('database.db')
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
print(cursor.fetchall())
Cuidado con mi otra respuesta . Hay una forma mucho más rápida de usar pandas.
cursor.close()
ydb.close()
La forma MÁS RÁPIDA de hacer esto en Python es utilizando Pandas (versión 0.16 y posteriores).
Volcar una mesa:
db = sqlite3.connect('database.db')
table = pd.read_sql_query("SELECT * from table_name", db)
table.to_csv(table_name + '.csv', index_label='index')
Volcar todas las tablas:
import sqlite3
import pandas as pd
def to_csv():
db = sqlite3.connect('database.db')
cursor = db.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
for table_name in tables:
table_name = table_name[0]
table = pd.read_sql_query("SELECT * from %s" % table_name, db)
table.to_csv(table_name + '.csv', index_label='index')
cursor.close()
db.close()
cursor.close()
y db.close()
.
with sqlite3.connect('database.db') as db:
Aquí hay un programa de Python corto y simple para imprimir los nombres de las tablas y los nombres de las columnas para esas tablas (python 2. sigue python 3).
import sqlite3
db_filename = 'database.sqlite'
newline_indent = '\n '
db=sqlite3.connect(db_filename)
db.text_factory = str
cur = db.cursor()
result = cur.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
table_names = sorted(zip(*result)[0])
print "\ntables are:"+newline_indent+newline_indent.join(table_names)
for table_name in table_names:
result = cur.execute("PRAGMA table_info('%s')" % table_name).fetchall()
column_names = zip(*result)[1]
print ("\ncolumn names for %s:" % table_name)+newline_indent+(newline_indent.join(column_names))
db.close()
print "\nexiting."
(EDITAR: He estado recibiendo votaciones periódicas sobre esto, así que aquí está la versión de python3 para las personas que están encontrando esta respuesta)
import sqlite3
db_filename = 'database.sqlite'
newline_indent = '\n '
db=sqlite3.connect(db_filename)
db.text_factory = str
cur = db.cursor()
result = cur.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
table_names = sorted(list(zip(*result))[0])
print ("\ntables are:"+newline_indent+newline_indent.join(table_names))
for table_name in table_names:
result = cur.execute("PRAGMA table_info('%s')" % table_name).fetchall()
column_names = list(zip(*result))[1]
print (("\ncolumn names for %s:" % table_name)
+newline_indent
+(newline_indent.join(column_names)))
db.close()
print ("\nexiting.")
Aparentemente, la versión de sqlite3 incluida en Python 2.6 tiene esta capacidad: http://docs.python.org/dev/library/sqlite3.html
# Convert file existing_db.db to SQL dump file dump.sql
import sqlite3, os
con = sqlite3.connect('existing_db.db')
with open('dump.sql', 'w') as f:
for line in con.iterdump():
f.write('%s\n' % line)
Después de mucho juguetear, encontré una mejor respuesta en sqlite docs para enumerar los metadatos de la tabla, incluso las bases de datos adjuntas.
meta = cursor.execute("PRAGMA table_info('Job')")
for r in meta:
print r
La información clave es prefijar table_info, no my_table con el nombre del identificador de archivo adjunto.
Job
tabla: meta = cursor.execute("PRAGMA table_info('Job')")
Y su primera línea parece no estar relacionada con el resto.
Si alguien quiere hacer lo mismo con los pandas
import pandas as pd
import sqlite3
conn = sqlite3.connect("db.sqlite3")
table = pd.read_sql_query("SELECT name FROM sqlite_master WHERE type='table'", conn)
print(table)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
if __name__ == "__main__":
import sqlite3
dbname = './db/database.db'
try:
print "INITILIZATION..."
con = sqlite3.connect(dbname)
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
for tbl in tables:
print "\n######## "+tbl[0]+" ########"
cursor.execute("SELECT * FROM "+tbl[0]+";")
rows = cursor.fetchall()
for row in rows:
print row
print(cursor.fetchall())
except KeyboardInterrupt:
print "\nClean Exit By user"
finally:
print "\nFinally"
He implementado un analizador de esquema de tabla sqlite en PHP, puede consultar aquí: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php
Puede usar este analizador de definiciones para analizar las definiciones como el código a continuación:
$parser = new SqliteTableDefinitionParser;
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)');