2008-11-20 14 views
92

Đối với một số lý do tôi không thể tìm thấy một cách để có được sự tương đương của các lệnh shell tương tác sqlite của:Danh sách bảng biểu, sơ đồ db, đổ vv bằng cách sử dụng Python sqlite3 API

.tables 
.dump 

sử dụng Python sqlite3 API.

Có điều gì giống 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ự là phổ dụng cho các giao diện sử dụng SQL. – Unode

+2

Đúng, mặc dù tôi đã mong đợi một API python khi yêu cầu 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 http://stackoverflow.com/questions/82875/how-do-i-list-the-tables-in-a-sqlite-database-file. 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 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ị các bảng Python sqlite3" vì Google biết tiêu đề câu hỏi cũ. Các tìm kiếm trong SO sẽ không hạ cánh tại đây. Nếu không có góc Python, câu hỏi trùng lặp được liên kết 82875 đã nhận được nhiều trí tuệ đám đông hơn. –

Trả lời

71

Bạn có thể lấy 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 
) 
17

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

SELECT * FROM sqlite_master; 
2

Check-out here cho dump. Dường như có một hàm dump trong thư viện sqlite3.

+0

Tôi đang cố gắng: nhập khẩu sqlite3 con = sqlite3.connect ("test.db") con.dump() Nó thất bại ... Tôi tiếp tục kiểm tra – Angel

17

Rõ ràng phiên bản của sqlite3 trong Python 2.6 có khả năng này: 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

Hãy cẩn thận với điều này, nó sẽ in tất cả các dữ liệu trong các bảng của bạn nếu chúng được điền bằng các câu lệnh INSERT INTO! – RobinL

148

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 answer khác của tôi. Có một cách nhanh hơn bằng cách sử dụng gấu trúc.

1

Sau rất nhiều khó khăn, tôi tìm thấy câu trả lời hay hơn tại sqlite docs để liệt kê siêu dữ liệu cho bảng, ngay 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.

+0

Tôi gặp nhiều lỗi trong đoạn trích bạn đã viết và không thấy ví dụ "db_alias" trong tài liệu được tham chiếu hoặc trong các ví dụ khác. Trong bối cảnh của các ví dụ khác, tôi nghĩ bạn muốn dòng này, ví dụ: bảng 'Job':' 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

0

Tôi đã thực hiện một phân tích cú pháp schema bảng sqlite trong PHP, bạn có thể kiểm tra ở đây: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php

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

$parser = new SqliteTableDefinitionParser; 
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)'); 
32

nhanh nhất cách làm điều này trong python đang sử dụng Pandas (phiên bản 0.16 trở lên).

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

Dump 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') 
1
#!/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" 
1

Dưới đây là một chương trình python ngắn và đơn giản để in ra tên bảng và tên cột trong các bảng.

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