Python sqlite3 API'sini kullanarak tablolar, db şeması, döküm vb. Listesi


150

Nedense sqlite interaktif kabuk komutlarının eşdeğerlerini almak için bir yol bulamıyorum:

.tables
.dump

Python sqlite3 API kullanarak.

Böyle bir şey var mı?


1
Cevap aslında SQL kullanan arabirimler için evrensel olduğundan soruyu python'a özgü olmayan bir şeye yeniden adlandırmanızı öneririm.
16'da unode

2
Doğru, ben sorurken bir python API bekliyordum rağmen. Doğru ismi bulmaya çalışacağım.
noamtm

3
Sqlite3 komut isteminden tablo göstermek istiyorsanız, stackoverflow.com/questions/82875/… adresine bakın . Python sqlite3 paketini kullanıyorsanız, Davoud Taghawi-Nejad'ın cevabına buradan bakın. OP'nin soru başlığına Python eklemesini öneriyorum ve Davoud'un cevabını seçiyorum. Google eski soru başlığını bildiğinden, bu sayfayı "tabloları Python sqlite3 göster" şeklinde arayarak buldum. SO içindeki aramalar buraya inmez. Python açısı olmadan, bağlantılı yinelenen soru 82875 çok daha fazla kalabalık bilgeliği aldı.
Bennett Brown

Yanıtlar:


106

SQLITE_MASTER tablosunu sorgulayarak tabloların ve şemaların listesini alabilirsiniz:

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
)

2
sqlite> .schema jobpython'da geçersiz sözdizimi ... ne eksik?
jbuddy_13

1
@ jbuddy_13 diğer cevaba
Pro Q

1
@ jbuddy_13 sqlite>sqlite komut satırı istemcisidir. Örneğin amacı tabloları ve şemaları listelemek için veritabanını nasıl sorgulayabildiğini göstermekti.
dönüştürücü42

245

Python'da:

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

Diğer cevabıma dikkat et . Pandaları kullanmanın çok daha hızlı bir yolu var.


13
Kopya gelen kullanıcılar için / yapıştırın: yaptığınızdan emin olun cursor.close()vedb.close()
T.Woody

1
Bu doğru cevap gibi görünüyor, ancak OP başka bir tane onayladı ...
a_a_a

3
@a_a_a Umm 4 yıllık fark?
Mooncrater

72

Bunu python ile yapmanın en HIZLI yolu, Pandalar (sürüm 0.16 ve üstü) kullanmaktır.

Bir tabloyu dök:

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

Tüm tabloları dök:

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()

3
Kopyalamak için gelen kullanıcılar için / yapıştırın: emin olun cursor.close()ve db.close().
T.Woody

2
ya da daha iyi kullanımwith sqlite3.connect('database.db') as db:
frans

23

Python API'sini bilmiyorum, ancak her zaman

SELECT * FROM sqlite_master;

20

İşte tablo adlarını ve bu tabloların sütun adlarını yazdırmak için kısa ve basit bir python programı (python 2. python 3 aşağıdadır).

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."

(DÜZENLEME: Bu konuda periyodik oy kullanıyorum, işte bu cevabı bulan insanlar için python3 sürümü)

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.")

17

Görünüşe göre Python 2.6'da bulunan sqlite3 sürümü şu yeteneğe sahip: 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)

1
Buna dikkat edin, tablodaki tüm verileri INSERT INTO ifadeleriyle doldurulmuşsa yazdırır!
RobinL

4

Çok uğraştıktan sonra , tablo için meta verileri, hatta ekli veritabanlarını listelemek için sqlite belgelerinde daha iyi bir cevap buldum .

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

Anahtar bilgiler, eki tanıtıcı adıyla my_table değil tablo_info önekidir.


Yazdığınız snippet'te çok fazla hata var ve başvurulan dokümanlar veya diğer örneklerde "db_alias" ifadesini görmüyorum. Diğer örnekler bağlamında, bence bu çizgiyi istersiniz, örneğin Jobtablo: meta = cursor.execute("PRAGMA table_info('Job')") Ve ilk çizginiz geri kalanıyla ilgisiz görünüyor.
nealmcb

4

Birisi Pandalar ile aynı şeyi yapmak istiyorsa

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)

1
Jupyter Notebook ve Pandalar bu soruya cevap vermek zorunda değil
woggioni

Böyle yararlı bir cevabı çarpmaya gerek yok. Her zaman olduğu gibi, bir bağlam yöneticisi önerilir.
user66081

Bunun en temiz ve en yararlı cevap olduğunu düşünüyorum.
NL23 kodları

2

Döküm için buraya göz atın . Görünüşe göre sqlite3 kütüphanesinde bir döküm fonksiyonu var.


Deniyorum: import sqlite3 con = sqlite3.connect ("test.db") con.dump () Başarısız ... Kontrol etmeye devam et
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"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.