Om de een of andere reden kan ik geen manier vinden om de equivalenten van de interactieve shell-opdrachten van sqlite te krijgen:
.tables
.dump
met behulp van de Python sqlite3-API.
Is er zoiets?
Antwoord 1, autoriteit 100%
In Python:
con = sqlite3.connect('database.db')
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
print(cursor.fetchall())
Pas op voor mijn andere antwoord. Er is een veel snellere manier om panda’s te gebruiken.
Antwoord 2, autoriteit 36%
U kunt de lijst met tabellen en schema’s ophalen door de SQLITE_MASTER-tabel op te vragen:
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
)
Antwoord 3, autoriteit 29%
De SNELSTE manier om dit te doen in Python is het gebruik van Panda’s (versie 0.16 en hoger).
Dump één tafel:
db = sqlite3.connect('database.db')
table = pd.read_sql_query("SELECT * from table_name", db)
table.to_csv(table_name + '.csv', index_label='index')
Dump alle tabellen:
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()
Antwoord 4, autoriteit 11%
Ik ben niet bekend met de Python API, maar je kunt altijd gebruiken
SELECT * FROM sqlite_master;
Antwoord 5, autoriteit 9%
Hier is een kort en eenvoudig python-programma om de tabelnamen en de kolomnamen voor die tabellen af te drukken (python 2. python 3 volgt).
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: ik krijg hier regelmatig stemmen over, dus hier is de python3-versie voor mensen die dit antwoord vinden)
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.")
Antwoord 6, autoriteit 7%
Als iemand hetzelfde wil doen met Panda’s
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)
Antwoord 7, autoriteit 6%
Blijkbaar heeft de versie van sqlite3 in Python 2.6 deze mogelijkheid: 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)
Antwoord 8, autoriteit 2%
Sommigen vinden mijn functie misschien handig als je alle tabellen en kolommen in je database wilt afdrukken.
In de lus vraag ik elke TABLE met LIMIT 0, zodat het alleen de header-info retourneert zonder alle gegevens. Je maakt er een lege df van en gebruikt de iterabele df.columns om elke kolomnaam af te drukken.
conn = sqlite3.connect('example.db')
c = conn.cursor()
def table_info(c, conn):
'''
prints out all of the columns of every table in db
c : cursor object
conn : database connection object
'''
tables = c.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
for table_name in tables:
table_name = table_name[0] # tables is a list of single item tuples
table = pd.read_sql_query("SELECT * from {} LIMIT 0".format(table_name), conn)
print(table_name)
for col in table.columns:
print('\t' + col)
print()
table_info(c, conn)
Results will be:
table1
column1
column2
table2
column1
column2
column3
etc.
Antwoord 9, autoriteit 2%
Na veel gehannes vond ik een beter antwoord op sqlite docsvoor het vermelden van de metadata voor de tabel, zelfs bijgevoegde databases.
meta = cursor.execute("PRAGMA table_info('Job')")
for r in meta:
print r
De belangrijkste informatie is om table_info te prefixen, niet my_table met de naam van de bijlage-handle.
Antwoord 10
Bekijk hiervoor dump. Het lijkt erop dat er een dump-functie is in de bibliotheek sqlite3.
Antwoord 11
#!/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"
Antwoord 12
Ik heb een sqlite-tabelschema-parser in PHP geïmplementeerd, u kunt dit hier controleren: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php
Je kunt deze definitie-parser gebruiken om de definities te ontleden, zoals de onderstaande code:
$parser = new SqliteTableDefinitionParser;
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)');