sqlite3 и python: получить список первичных и внешних ключей

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

Использование Python2.7, SQLite3, PyCharm.

sqlite3.версия = 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

person a11    schedule 29.01.2019    source источник


Ответы (2)


Неизвестные или неправильно сформированные операторы 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())
person CL.    schedule 29.01.2019
comment
спасибо @КЛ. в случае, если у кого-то еще есть связанный вопрос, нашел хорошее дополнение с объяснением выходов PRAGMA foreign_key_list: stackoverflow.com/questions/44424476/ - person a11; 29.01.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

person 杨李思    schedule 29.01.2019
comment
это синтаксис python sqlite3? - person a11; 29.01.2019