Lijst met tabellen, db-schema, dump enz. met behulp van de Python sqlite3 API

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)');

Other episodes