SQLite Schema信息元数据

| 我需要在SQLite数据库中获取列名及其表。我需要一个包含2列的结果集:
table_name | column_name
。 在MySQL中,我可以通过数据库
INFORMATION_SCHEMA
上的SQL查询获取此信息。但是,SQLite提供表
sqlite_master
sqlite> create table students (id INTEGER, name TEXT);
sqlite> select * from sqlite_master;
  table|students|students|2|CREATE TABLE students (id INTEGER, name TEXT)
这会导致DDL构造查询(
CREATE TABLE
)对我无济于事,我需要对此进行解析以获取相关信息。 我需要获取表列表并将其与列连接,或者仅将列与表名称列一起获取。因此,table5 name对我不起作用,因为我没有表格名称。我想获取数据库中的所有列元数据。 是否有更好的方法通过查询数据库来获取该信息作为结果集?     
已邀请:

bab

        您基本上已经在问题中命名了解决方案。 要获取表(和视图)的列表,请查询sqlite_master,如下所示
SELECT name, sql FROM sqlite_master
WHERE type=\'table\'
ORDER BY name;
(请参阅SQLite常见问题解答) 要获取有关特定表中列的信息,请使用SQLite PRAGMA文档中所述的“ 7”。 我不知道以任何查询的方式返回tablename | columnname的任何方法。我不相信SQLite支持这一点。最好的选择是将这两种方法一起使用以返回您要查找的信息-首先使用sqlite_master获取表列表,然后使用PRAGMA table_info()遍历它们以获取其列。     
        有\“。tables \”和\“。schema [table_name] \”命令,它们为您从\“ select * from sqlite_master; \”获得的结果提供了一种单独的版本。 还有\“ pragma table_info([table_name]); \”命令可获得更好的解析结果,而不是构造查询:
sqlite> .tables
students
sqlite> .schema students
create table students(id INTEGER, name TEXT);
sqlite> pragma table_info(students);
0|id|INTEGER|0||0
1|name|TEXT|0||0
希望能在某种程度上有所帮助...     
        仅供参考,如果您使用的是.Net,则可以使用
DbConnection.GetSchema
方法来检索通常位于INFORMATION_SCHEMA中的信息。如果您有一个抽象层,则可以为所有类型的数据库使用相同的代码(注意,MySQL似乎将限制数组的第1个第2个参数夹在中间)。     
        另一个有用的技巧是首先从sqlite_master获取所有表名。 然后,为每个查询引发一个查询“从*中选择*,其中1 = 0 \”。如果您分析结果查询的结构-取决于您从中调用哪种语言/ api-您将获得一个描述列的丰富结构。 在python中
c = ...db.cursor()
c.execute(\"select * from t where 1=0\");
c.fetchall();
print c.description;
朱拉杰 PS。我习惯使用\'where 1 = 0 \'的习惯,因为记录限制的语法似乎因数据库而异。此外,一个好的数据库将优化这个永远为假的子句。 在SQLite中,使用\'limit 0 \'可获得相同的效果。     
        最新版本的SQLite允许您现在针对PRAGMA结果进行选择,这使此操作变得容易:
SELECT 
  m.name as table_name, 
  p.name as column_name
FROM 
  sqlite_master AS m
JOIN 
  pragma_table_info(m.name) AS p
ORDER BY 
  m.name, 
  p.cid
其中
p.cid
保存CREATE TABLE语句的列顺序(零索引)。 David Garoutte在这里回答了这个问题,但是此SQL应该执行得更快,并且列是按架构排序的,而不是按字母顺序排序。 请注意,“ 13”也包含
type
(数据类型,例如
integer
text
),
notnull
(如果列具有
NOT NULL
约束,则为
1
dflt_value
(如果没有默认值,则为
NULL
pk
(如果列是表的主键,则为
1
,否则为
0
) RTFM:https://www.sqlite.org/pragma.html#pragma_table_info     
        试试这个sqlite表架构解析器,我实现了sqlite表解析器来解析PHP中的表定义。 它返回完整的定义(唯一,主键,类型,精度,非空,引用,表约束等)。 https://github.com/maghead/sqlite-parser 语法遵循sqlite create table语句语法:http://www.sqlite.org/lang_createtable.html     
        这是一个古老的问题,但是由于已经查看了很多次,我们出于简单的原因将其添加到该问题中,大多数答案都告诉您如何在SQLite数据库中查找表名。 当表名不在数据库中时,您会怎么做? 我们的应用程序正在发生这种情况,因为我们正在以编程方式创建TABLES 因此,当表不在数据库中或由数据库创建时,下面的代码将解决该问题。
    public void toPageTwo(View view){

    if(etQuizTable.getText().toString().equals(\"\")){
        Toast.makeText(getApplicationContext(), \"Enter Table Name\\n\\n\"
                +\"           OR\"+\"\\n\\nMake Table First\", Toast.LENGTH_LONG 
   ).show();
        etQuizTable.requestFocus();
        return;
    }

    NEW_TABLE = etQuizTable.getText().toString().trim();
    db = dbHelper.getWritableDatabase();
    ArrayList<String> arrTblNames = new ArrayList<>();
    Cursor c = db.rawQuery(\"SELECT name FROM sqlite_master WHERE 
   type=\'table\'\", null);

    if (c.moveToFirst()) {
        while ( !c.isAfterLast() ) {
            arrTblNames.add( c.getString( c.getColumnIndex(\"name\")) );
            c.moveToNext();
        }
    }
    c.close();
    db.close();

    boolean matchFound = false;
    for(int i=0;i<arrTblNames.size();i++) {
        if(arrTblNames.get(i).equals(NEW_TABLE)) {
            Intent intent = new Intent(ManageTables.this, TableCreate.class 
   );
            startActivity( intent );
            matchFound = true;
        }
    }
    if (!matchFound) {
        Toast.makeText(getApplicationContext(), \"No Such Table\\n\\n\"
                +\"           OR\"+\"\\n\\nMake Table First\", Toast.LENGTH_LONG 
 ).show();
        etQuizTable.requestFocus();
    }
}
    

要回复问题请先登录注册