Pour une raison quelconque, je ne trouve pas de moyen d'obtenir les équivalents des commandes shell interactives de sqlite:
.tables
.dump
à l'aide de l'API Python sqlite3.
Y a-t-il quelque chose comme ça?
Pour une raison quelconque, je ne trouve pas de moyen d'obtenir les équivalents des commandes shell interactives de sqlite:
.tables
.dump
à l'aide de l'API Python sqlite3.
Y a-t-il quelque chose comme ça?
Réponses:
Vous pouvez récupérer la liste des tables et des schémas en interrogeant la table 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
syntaxe invalide en python ... que me manque-t-il?
sqlite>
est l'invite du client de ligne de commande sqlite. Le but de l'exemple était de montrer comment on pouvait interroger la base de données pour lister les tables et le schéma.
En Python:
con = sqlite3.connect('database.db')
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
print(cursor.fetchall())
Attention à mon autre réponse . Il existe un moyen beaucoup plus rapide d'utiliser les pandas.
cursor.close()
etdb.close()
La façon la plus rapide de faire cela en python utilise Pandas (version 0.16 et plus).
Videz une table:
db = sqlite3.connect('database.db')
table = pd.read_sql_query("SELECT * from table_name", db)
table.to_csv(table_name + '.csv', index_label='index')
Videz toutes les tables:
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()
et db.close()
.
with sqlite3.connect('database.db') as db:
Voici un programme python court et simple pour imprimer les noms de table et les noms de colonne de ces tables (python 2. python 3 suit).
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."
(EDIT: J'ai reçu des votes périodiques à ce sujet, voici donc la version python3 pour les personnes qui trouvent cette réponse)
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.")
Apparemment, la version de sqlite3 incluse dans Python 2.6 a cette capacité: 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)
Après beaucoup de bidouillage, j'ai trouvé une meilleure réponse sur sqlite docs pour lister les métadonnées de la table, même les bases de données attachées.
meta = cursor.execute("PRAGMA table_info('Job')")
for r in meta:
print r
Les informations clés sont de préfixer table_info, et non ma_table avec le nom du descripteur de pièce jointe.
Job
tableau: meta = cursor.execute("PRAGMA table_info('Job')")
Et votre première ligne semble sans rapport avec le reste.
Si quelqu'un veut faire la même chose avec les 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"
J'ai implémenté un analyseur de schéma de table sqlite en PHP, vous pouvez vérifier ici: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php
Vous pouvez utiliser cet analyseur de définition pour analyser les définitions comme le code ci-dessous:
$parser = new SqliteTableDefinitionParser;
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)');