有没有办法从python中获取数据库的模式?

tij*_*jko 22 python sqlite database-schema

我试图找到一种方法来查找数据库中的表名称(如果存在).我发现从sqlite cli我可以使用:

>.tables
Run Code Online (Sandbox Code Playgroud)

那么对于字段:

>PRAGMA TABLE_INFO(table_name)
Run Code Online (Sandbox Code Playgroud)

这显然在python中不起作用.有没有办法用python做这个或者我应该只使用sqlite命令行?

Mar*_*ers 32

来自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
);
Run Code Online (Sandbox Code Playgroud)

因此,要获取所有表名的列表,请执行:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
Run Code Online (Sandbox Code Playgroud)

要获取给定表的列名,请使用以下pragma table_info命令:

该pragma为命名表中的每列返回一行.结果集中的列包括列名,数据类型,列是否可以为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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,pragma语句不适用于参数; 你必须手动插入表名(确保它不是来自不受信任的来源并正确地转义它).


Tom*_*err 24

您应该能够从sqlite_master表中访问表名.

SELECT name FROM sqlite_master WHERE type='table';
Run Code Online (Sandbox Code Playgroud)

列的名称不能直接访问.获取它们的最简单方法是查询表并从查询结果中获取列名.

SELECT * FROM table_name LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

  • 只需注意,如果尚未向表中添加任何行,则第二个查询将无效. (2认同)

Wil*_*ega 7

这是我根据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 "",
            ))
Run Code Online (Sandbox Code Playgroud)