sqlite3 & python: получить список первичных и внешних ключей - PullRequest
0 голосов
/ 29 января 2019

Я очень новичок в SQL и среднего уровня в Python.Используя sqlite3, как получить список print () первичных и внешних ключей (для таблицы) в моей базе данных?

Используя Python2.7, SQLite3, PyCharm.

sqlite3.version= 2.6.0

sqlite3.sqlite_version = 3.8.11

Также обратите внимание: когда я настраивал базу данных, я включал FK как:

conn = sqlite3.connect(db_file)
conn.execute('pragma foreign_keys=ON')

Я пыталсяследующее:

conn=sqlite3.connect(db_path)
print(conn.execute("PRAGMA table_info"))
print(conn.execute("PRAGMA foreign_key_list"))

Что вернуло:

<sqlite3.Cursor object at 0x0000000002FCBDC0>
<sqlite3.Cursor object at 0x0000000002FCBDC0>

Я также попробовал следующее, которое ничего не печатает (но я думаю, что это может быть, потому что это фиктивная база данных с таблицамии поля, но без записей ):

conn=sqlite3.connect(db_path)
rows = conn.execute('PRAGMA table_info')
for r in rows:
    print r
rows2 = conn.execute('PRAGMA foreign_key_list')
for r2 in rows2:
    print r2

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Неизвестные или неправильно сформированные операторы PRAGMA игнорируются.

Проблема с вашими PRAGMA заключается в том, что имя таблицы отсутствует.Вы должны получить список всех таблиц, а затем выполнить эти PRAGMA для каждой из них:

rows = db.execute("SELECT name FROM sqlite_master WHERE type = 'table'")
tables = [row[0] for row in rows]

def sql_identifier(s):
    return '"' + s.replace('"', '""') + '"'

for table in tables:
    print("table: " + table)
    rows = db.execute("PRAGMA table_info({})".format(sql_identifier(table)))
    print(rows.fetchall())
    rows = db.execute("PRAGMA foreign_key_list({})".format(sql_identifier(table)))
    print(rows.fetchall())
0 голосов
/ 29 января 2019
SELECT 
    name
FROM 
    sqlite_master 
WHERE 
    type ='table' AND 
name NOT LIKE 'sqlite_%';

этот sql покажет всю таблицу в базе данных, для каждого запуска таблицы sql PRAGMA table_info(your_table_name); вы можете получить первичный ключ таблицы.

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

...