Danh sách các bảng, lược đồ db, kết xuất vv bằng cách sử dụng API Python sqlite3


151

Vì một số lý do, tôi không thể tìm ra cách để có được các lệnh tương tác của lệnh shell tương tác của sqlite:

.tables
.dump

sử dụng API Python sqlite3.

Có điều gì như vậy không?


1
Tôi đề nghị đổi tên câu hỏi thành một cái gì đó không phải python cụ thể vì câu trả lời thực sự phổ biến cho các giao diện sử dụng SQL.
giải mã

2
Đúng, mặc dù tôi đã mong đợi API python khi hỏi nó. Tôi sẽ cố gắng tìm đúng tên.
noamtm

3
Nếu muốn hiển thị các bảng từ dấu nhắc lệnh sqlite3, hãy tham khảo stackoverflow.com/questions/82875/ . Nếu sử dụng gói Python sqlite3, hãy xem câu trả lời của Davoud Taghawi-Nejad tại đây. Tôi đề nghị OP thêm Python trở lại vào tiêu đề câu hỏi và chọn câu trả lời của Davoud. Tôi đã tìm thấy trang này bằng cách googling "hiển thị bảng Python sqlite3" vì Google biết tiêu đề câu hỏi cũ. Tìm kiếm trong SO sẽ không hạ cánh ở đây. Không có góc Python, câu hỏi trùng lặp được liên kết 82875 đã nhận được sự khôn ngoan của đám đông hơn nhiều.
Bennett Brown

Câu trả lời:


106

Bạn có thể tìm nạp danh sách các bảng và lược đồ bằng cách truy vấn bảng 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
)

2
sqlite> .schema jobcú pháp không hợp lệ trong python ... tôi đang thiếu gì?
jbuddy_13

1
@ jbuddy_13 xem câu trả lời khác
Pro Q

1
@ jbuddy_13 sqlite>là dấu nhắc máy khách dòng lệnh sqlite. Mục đích của ví dụ là chứng minh làm thế nào người ta có thể truy vấn cơ sở dữ liệu để liệt kê các bảng và lược đồ.
chuyển đổi42

245

Trong Python:

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

Coi chừng khác của tôi câu trả lời . Có một cách nhanh hơn nhiều bằng cách sử dụng gấu trúc.


13
Đối với người dùng đến sao chép / dán: Hãy chắc chắn cursor.close()db.close()
T.Woody

1
Đây dường như là câu trả lời đúng nhưng OP đã chấp thuận một câu trả lời khác ...
a_a_a

3
@a_a_a Umm chênh lệch 4 năm?
Mooncrater

72

Cách NHANH NHẤT để làm điều này trong python là sử dụng Pandas (phiên bản 0.16 trở lên).

Đổ một bảng:

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

Kết xuất tất cả các bảng:

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
Đối với người dùng đến sao chép / dán: Hãy chắc chắn cursor.close()db.close().
T.Woody

2
hoặc sử dụng tốt hơnwith sqlite3.connect('database.db') as db:
frans

23

Tôi không quen với API Python nhưng bạn luôn có thể sử dụng

SELECT * FROM sqlite_master;

20

Đây là một chương trình python ngắn và đơn giản để in tên bảng và tên cột cho các bảng đó (python 2. python 3 theo sau).

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: Tôi đã nhận được phiếu bầu định kỳ về vấn đề này, vì vậy đây là phiên bản python3 cho những người đang tìm thấy câu trả lời này)

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

Rõ ràng phiên bản của sqlite3 có trong Python 2.6 có khả năng này: http://docs.python.org/dev/l 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
Hãy cẩn thận với điều này, nó sẽ in tất cả dữ liệu trong các bảng của bạn nếu chúng được điền với các câu lệnh INSERT INTO!
RobinL

4

Sau nhiều lần nghịch ngợm, tôi đã tìm thấy một câu trả lời tốt hơn tại các tài liệu sqlite để liệt kê siêu dữ liệu cho bảng, thậm chí cả các cơ sở dữ liệu đính kèm.

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

Thông tin chính là tiền tố table_info, không phải my_table với tên xử lý tệp đính kèm.


Tôi đã có rất nhiều lỗi trong đoạn mã bạn đã viết và không thấy ví dụ: "db_alias" trong các tài liệu được tham chiếu hoặc trong các ví dụ khác. Trong ngữ cảnh của các ví dụ khác, tôi nghĩ bạn muốn dòng này, ví dụ như Jobbảng: meta = cursor.execute("PRAGMA table_info('Job')") Và dòng đầu tiên của bạn dường như không liên quan đến phần còn lại.
nealmcb

4

Nếu ai đó muốn làm điều tương tự với 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)

1
Jupyter Notebook và Pandas không bắt buộc phải trả lời câu hỏi này
woggioni

Không cần phải đóng một câu trả lời hữu ích như vậy. Mặc dù, như thường lệ, một trình quản lý bối cảnh được khuyến nghị.
user66081

Tôi thấy đây là câu trả lời sạch nhất và hữu ích nhất.
NL23 mã

2

Kiểm tra ở đây cho bãi. Có vẻ như có một hàm dump trong thư viện sqlite3.


Tôi đang cố gắng: nhập sqlite3 con = sqlite3.connect ("test.db") con.dump () Không thành công ... Tôi tiếp tục kiểm tra
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"

0

Tôi đã triển khai trình phân tích cú pháp lược đồ bảng sqlite trong PHP, bạn có thể kiểm tra tại đây: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefTHERParser.php

Bạn có thể sử dụng trình phân tích cú pháp định nghĩa này để phân tích các định nghĩa như mã dưới đây:

$parser = new SqliteTableDefinitionParser;
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.