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?
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?
Câu trả lời:
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
)
sqlite> .schema job
cú pháp không hợp lệ trong python ... tôi đang thiếu gì?
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 đồ.
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.
cursor.close()
vàdb.close()
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()
cursor.close()
và db.close()
.
with sqlite3.connect('database.db') as db:
Đâ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.")
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)
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.
Job
bả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.
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)
#!/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"
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)');