Список таблиц, схема БД, дамп и т. Д. С использованием Python sqlite3 API

150

По какой-то причине я не могу найти способ получить эквиваленты интерактивных команд оболочки sqlite:

.tables
.dump

используя Python sqlite3 API.

Есть что-нибудь подобное?

noamtm
источник
1
Я предлагаю переименовать вопрос в нечто не специфичное для Python, так как ответ на самом деле универсален для интерфейсов, использующих SQL.
unode 11.11.10
2
Правда, хотя я ожидал, что Python API спросит об этом. Я постараюсь найти правильное имя.
Noamtm
3
Если вы хотите отобразить таблицы из командной строки sqlite3, обратитесь к stackoverflow.com/questions/82875/… . Если вы используете пакет Python sqlite3, посмотрите ответ Давуда Тагави-Неджада здесь. Я предлагаю ОП добавить Python обратно в заголовок вопроса и выбрать ответ Давуда. Я нашел эту страницу, погуглив "показать таблицы Python sqlite3", так как Google знает старый заголовок вопроса. Поиски внутри SO не смогли бы приземлиться здесь. Без угла Питона связанный дублирующий вопрос 82875 получил гораздо больше толпы мудрости.
Беннет Браун

Ответы:

106

Вы можете получить список таблиц и схем, запросив таблицу 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
)
converter42
источник
2
sqlite> .schema jobневерный синтаксис в Python ... что мне не хватает?
jbuddy_13
1
@ jbuddy_13 см. другой ответ
Pro Q
1
@ jbuddy_13 sqlite>- это клиентская строка командной строки sqlite. Цель этого примера состояла в том, чтобы продемонстрировать, как можно запросить базу данных для отображения таблиц и схем.
конвертер42
245

В Python:

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

Остерегайтесь моего другого ответа . Существует гораздо более быстрый способ использования панд.

Давуд Тагави-Неджад
источник
13
Для пользователей, которые собираются копировать / вставлять: Обязательно cursor.close()иdb.close()
T.Woody
1
Кажется, это правильный ответ, но ОП одобрил еще один ...
a_a_a
3
@a_a_a Умм разница в 4 года?
Mooncrater
72

Самый быстрый способ сделать это в Python - использовать Pandas (версия 0.16 и выше).

Дамп одной таблицы:

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

Дамп всех таблиц:

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
Для пользователей, которые приходят копировать / вставлять: обязательно cursor.close()и db.close().
Т. Вуди
2
или лучше использоватьwith sqlite3.connect('database.db') as db:
франц
23

Я не знаком с Python API, но вы всегда можете использовать

SELECT * FROM sqlite_master;
finnw
источник
20

Вот короткая и простая программа на python для распечатки имен таблиц и имен столбцов для этих таблиц (python 2. следует python 3).

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

(РЕДАКТИРОВАТЬ: я получаю периодические голосования по этому вопросу, так что вот версия python3 для людей, которые находят этот ответ)

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
источник
17

Очевидно, версия sqlite3, включенная в Python 2.6, обладает такой возможностью: 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
Будьте осторожны с этим, он напечатает все данные в ваших таблицах, если они заполнены операторами INSERT INTO!
RobinL
4

После долгих раздумий я нашел лучший ответ в sqlite docs для перечисления метаданных для таблицы, даже для прикрепленных баз данных.

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

Ключевой информацией является префикс table_info, а не my_table с именем дескриптора вложения.

user3451435
источник
Я получил много ошибок в написанном вами фрагменте и не вижу, например, "db_alias" ни в ссылочных документах, ни в других примерах. В контексте других примеров, я думаю, вы хотите эту строку, например, Jobтаблицу: meta = cursor.execute("PRAGMA table_info('Job')") и ваша первая строка кажется не связанной с остальными.
nealmcb
4

Если кто-то хочет сделать то же самое с пандами

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 и Pandas не обязаны отвечать на этот вопрос
woggioni
Не надо хлопать таким полезным ответом. Хотя, как обычно, рекомендуется контекстный менеджер.
user66081
Я считаю, что это самый чистый и полезный ответ.
NL23 коды
2

Проверьте здесь на свалку. Кажется, в библиотеке sqlite3 есть функция дампа.

ангел
источник
Я пытаюсь: import sqlite3 con = sqlite3.connect ("test.db") con.dump () Не удается ... Я продолжаю проверять
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"
Vech
источник
0

Я реализовал синтаксический анализатор таблиц sqlite в PHP, вы можете проверить здесь: https://github.com/c9s/LazyRecord/blob/master/src/LazyRecord/TableParser/SqliteTableDefinitionParser.php

Вы можете использовать этот анализатор определений для разбора определений, таких как код ниже:

$parser = new SqliteTableDefinitionParser;
$parser->parseColumnDefinitions('x INTEGER PRIMARY KEY, y DOUBLE, z DATETIME default \'2011-11-10\', name VARCHAR(100)');
c9s
источник