Daftar tabel, skema db, dump, dll menggunakan Python sqlite3 API

151

Untuk beberapa alasan saya tidak dapat menemukan cara untuk mendapatkan setara dengan perintah shell interaktif sqlite:

.tables
.dump

menggunakan API Python sqlite3.

Apakah ada yang seperti itu?

noamtm
sumber
1
Saya sarankan mengubah nama pertanyaan menjadi sesuatu yang bukan python spesifik karena jawabannya sebenarnya universal untuk antarmuka yang menggunakan SQL.
unode
2
Benar, meskipun saya mengharapkan API python ketika menanyakannya. Saya akan mencoba mencari nama yang tepat.
noamtm
3
Jika ingin menampilkan tabel dari command prompt sqlite3, lihat stackoverflow.com/questions/82875/… . Jika menggunakan paket Python sqlite3, lihat jawaban Davoud Taghawi-Nejad di sini. Saya sarankan OP tambahkan Python kembali ke judul pertanyaan dan pilih jawaban Davoud. Saya menemukan halaman ini dengan googling "tampilkan tabel Python sqlite3" karena Google tahu judul pertanyaan lama. Pencarian dalam SO akan gagal mendarat di sini. Tanpa sudut Python, pertanyaan duplikat 82875 yang ditautkan telah menerima jauh lebih banyak kebijaksanaan orang banyak.
Bennett Brown

Jawaban:

106

Anda bisa mengambil daftar tabel dan skema dengan menanyakan tabel 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
)
konverter42
sumber
2
sqlite> .schema jobsintaks tidak valid dalam python ... apa yang saya lewatkan?
jbuddy_13
1
@ jbuddy_13 lihat jawaban lain
Pro Q
1
@ jbuddy_13 sqlite>adalah prompt klien baris perintah sqlite. Tujuan dari contoh ini adalah untuk menunjukkan bagaimana seseorang dapat meminta database untuk mendaftar tabel dan skema.
converter42
245

Dengan Python:

con = sqlite3.connect('database.db')
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
print(cursor.fetchall())

Perhatikan jawaban saya yang lain . Ada cara yang jauh lebih cepat menggunakan panda.

Davoud Taghawi-Nejad
sumber
13
Untuk pengguna yang datang untuk menyalin / menempel: Pastikan untuk cursor.close()dandb.close()
T. Goody
1
Ini sepertinya jawaban yang benar namun OP menyetujui yang lain ...
a_a_a
3
@a_a_a Umm perbedaan 4 tahun?
Mooncrater
72

Cara TERCEPAT untuk melakukan ini dalam python adalah menggunakan Pandas (versi 0.16 dan lebih tinggi).

Buang satu meja:

db = sqlite3.connect('database.db')
table = pd.read_sql_query("SELECT * from table_name", db)
table.to_csv(table_name + '.csv', index_label='index')

Buang semua tabel:

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()
Davoud Taghawi-Nejad
sumber
3
Untuk pengguna yang datang untuk menyalin / menempel: Pastikan untuk cursor.close()dan db.close().
T.Woody
2
atau lebih baik digunakanwith sqlite3.connect('database.db') as db:
frans
23

Saya tidak terbiasa dengan API Python tetapi Anda selalu dapat menggunakan

SELECT * FROM sqlite_master;
menemukan
sumber
20

Berikut adalah program python pendek dan sederhana untuk mencetak nama tabel dan nama kolom untuk tabel tersebut (python 2. python 3 mengikuti).

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: Saya mendapatkan voting secara berkala, jadi ini adalah versi python3 untuk orang-orang yang menemukan jawaban ini)

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.")
RufusVS
sumber
17

Rupanya versi sqlite3 yang termasuk dalam Python 2.6 memiliki kemampuan ini: 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)
Periksa
sumber
1
Hati-hati dengan ini, ini akan mencetak semua data di tabel Anda jika diisi dengan pernyataan INSERT INTO!
RobinL
4

Setelah banyak mengutak-atik saya menemukan jawaban yang lebih baik di sqlite docs untuk daftar metadata untuk tabel, bahkan database terlampir.

meta = cursor.execute("PRAGMA table_info('Job')")
for r in meta:
    print r

Informasi kuncinya adalah awalan table_info, bukan my_table dengan nama pegangan lampiran.

pengguna3451435
sumber
Saya mendapat banyak kesalahan dalam cuplikan yang Anda tulis, dan tidak melihat misalnya "db_alias" baik dalam dokumen yang direferensikan atau dalam contoh lain. Dalam konteks contoh lain, saya pikir Anda ingin baris ini, misalnya Jobtabel: meta = cursor.execute("PRAGMA table_info('Job')") Dan baris pertama Anda tampaknya tidak terkait dengan yang lain.
nealmcb
4

Jika seseorang ingin melakukan hal yang sama dengan Panda

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)
Mukesh Yadav
sumber
1
Jupyter Notebook dan Pandas tidak diharuskan untuk menjawab pertanyaan ini
woggioni
Tidak perlu membanting jawaban yang bermanfaat. Meskipun, seperti biasa, manajer konteks dianjurkan.
user66081
Saya menemukan ini sebagai jawaban paling bersih dan paling berguna.
NL23 kode
2

Lihat di sini untuk dump. Tampaknya ada fungsi dump di library sqlite3.

malaikat
sumber
Saya mencoba: import sqlite3 con = sqlite3.connect ("test.db") con.dump () Gagal ... Saya terus memeriksa
Angel
2
#!/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"
Hebat
sumber