Есть ли способ получить схему базы данных из python?
Я пытаюсь найти способ найти имена таблиц в базе данных (если они существуют). Я нахожу, что из sqlite cli я могу использовать:
>.tables
Затем для полей:
>PRAGMA TABLE_INFO(table_name)
Это явно не работает в python. Есть ли способ сделать это с помощью python или я должен просто использовать командную строку sqlite?
Ответы
Ответ 1
Вы должны иметь доступ к именам таблиц из таблицы sqlite_master
.
SELECT name FROM sqlite_master WHERE type='table';
Имена столбцов напрямую недоступны. Самый простой способ получить их - это запросить таблицу и получить имена столбцов из результата запроса.
SELECT * FROM table_name LIMIT 1;
Ответ 2
Из sqlite FAQ:
В рамках программы C/C++ (или скрипта с использованием привязок Tcl/Ruby/Perl/Python) вы можете получить доступ к именам таблиц и индексов, выполнив SELECT
в специальной таблице с именем "SQLITE_MASTER". Каждая база данных SQLite имеет таблицу SQLITE_MASTER
которая определяет схему для базы данных. Таблица SQLITE_MASTER
выглядит так:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
Таким образом, чтобы получить список всех имен таблиц, выполните:
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
Чтобы получить имена столбцов для данной таблицы, используйте команду pragma table_info
:
Эта прагма возвращает одну строку для каждого столбца в названной таблице. Столбцы в результирующем наборе включают имя столбца, тип данных, может ли столбец NULL или значение по умолчанию для столбца.
Эта команда отлично работает с python:
>>> import sqlite3
>>> conn = sqlite3.connect(':mem:')
>>> for row in conn.execute("pragma table_info('sqlite_master')").fetchall():
... print row
...
(0, u'type', u'text', 0, None, 0)
(1, u'name', u'text', 0, None, 0)
(2, u'tbl_name', u'text', 0, None, 0)
(3, u'rootpage', u'integer', 0, None, 0)
(4, u'sql', u'text', 0, None, 0)
К сожалению, инструкции pragma
не работают с параметрами; вам придется вручную вставить имя таблицы (убедитесь, что она не получена из ненадежного источника и не сработает правильно).
Ответ 3
Здесь удобный принтер, который я написал на основе Martijn:
def printSchema(connection):
for (tableName,) in connection.execute(
"""
select NAME from SQLITE_MASTER where TYPE='table' order by NAME;
"""
):
print("{}:".format(tableName))
for (
columnID, columnName, columnType,
columnNotNull, columnDefault, columnPK,
) in connection.execute("pragma table_info('{}');".format(tableName)):
print(" {id}: {name}({type}){null}{default}{pk}".format(
id=columnID,
name=columnName,
type=columnType,
null=" not null" if columnNotNull else "",
default=" [{}]".format(columnDefault) if columnDefault else "",
pk=" *{}".format(columnPK) if columnPK else "",
))
Ответ 4
Чтобы получить имена полей, используйте cur.description после запроса:
import sqlite3.dbapi2 as sqlite
con = sqlite.connect(":memory:")
cur = con.cursor()
con.executescript("""
create table test (name, address);
insert into test (name, address) values ("Jer", "Monterey Street");
""")
cur.execute("select * from test where 1=0")
rs = cur.fetchall() ## will be [] because of where clause
field_names = [r[0] for r in cur.description]
Ответ 5
Используйте объект sqlite row. Объект row имеет ключи(), которые дадут вам схему.
от docs.python.org
conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('select * from stocks')
<sqlite3.Cursor object at 0x7f4e7dd8fa80>
r = c.fetchone()
type(r)
<type 'sqlite3.Row'>
r
(u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.14)
r.keys()
['date', 'trans', 'symbol', 'qty', 'price']
Ответ 6
Я просто попробовал
SELECT name FROM my_db.sqlite_master WHERE type='table';
объединить ответ Тома Керра и попытку получить информацию о присоединенной базе данных. Сначала это не сработало. Оказывается, мне сначала нужно прикрепить другую базу данных следующим образом:
ATTACH DATABASE 'file:my_other_database_file.db?cache=shared' as my_db;
в противном случае база данных не сможет получить блокировку чтения для присоединенной базы данных sqlite_master
(и все запросы будут успешными с нулевыми результатами). Просто намек на то, что кто-то еще споткнется на эту часть проблемы.
Ответ 7
в наборах результатов есть описание, из которого вы можете получить некоторую информацию. Он показывает некоторые базовые метаданные, такие как имя столбца и количество столбцов.
>>> rs = c.execute('''SELECT * FROM news WHERE 1=0''');
>>> dir(rs)
['__class__', '__delattr__', '__doc__', '__format__',
'__getattribute__', '__hash__', '__init__', '__iter__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', 'arraysize', 'close', 'connection',
**'description'**, 'execute', 'executemany', 'executescript', 'fetchall',
'fetchmany', 'fetchone', 'lastrowid', 'next', 'row_factory',
'rowcount', 'setinputsizes', 'setoutputsize']
>>> print(rs.description)
(('id', None, None, None, None, None, None),
('imageUrl', None, None, None, None, None, None),
('headline', None, None, None, None, None, None),
('who', None, None, None, None, None, None))