我如何可靠地在SQLite中检查特定的用户表是否存在?
我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)
原因如下:
在我的程序中,我需要创建并填充一些表,如果它们还不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?
或者我的方法有意义吗?
我如何可靠地在SQLite中检查特定的用户表是否存在?
我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)
原因如下:
在我的程序中,我需要创建并填充一些表,如果它们还不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?
或者我的方法有意义吗?
当前回答
如果你得到一个"table already exists"错误,在SQL字符串中做如下修改:
CREATE table IF NOT EXISTS table_name (para1,para2);
这样可以避免异常。
其他回答
Use:
PRAGMA table_info(your_table_name)
如果结果表为空,则your_table_name不存在。
文档:
编译指示schema.table_info(表名); 这个pragma为命名表中的每一列返回一行。结果集中的列包括列名、数据类型、列是否可以为NULL以及列的默认值。对于不属于主键的列,结果集中的“pk”列为零;对于属于主键的列,结果集中的“pk”列是主键中的列的索引。 在table_info pragma中命名的表也可以是视图。
示例输出:
cid|name|type|notnull|dflt_value|pk
0|id|INTEGER|0||1
1|json|JSON|0||0
2|name|TEXT|0||0
我喜欢的方法是:
SELECT "name" FROM pragma_table_info("table_name") LIMIT 1;
如果您得到一个行结果,则该表存在。这是更好的(对我),然后检查sqlite_master,因为它也将检查附加和临时数据库。
在我看来,使用一个简单的SELECT查询是非常可靠的。最重要的是,它可以检查表是否存在于许多不同的数据库类型(SQLite / MySQL)。
SELECT 1 FROM table;
当您可以使用其他可靠的机制来确定查询是否成功时(例如,您可以通过Qt中的QSqlQuery查询数据库),这是有意义的。
你可以试试:
SELECT name FROM sqlite_master WHERE name='table_name'
我现在在c#中发现的最可靠的方法是使用最新的SQLite -net-pcl nuget包(1.5.231),它使用SQLite 3,如下所示:
var result = database.GetTableInfo(tableName);
if ((result == null) || (result.Count == 0))
{
database.CreateTable<T>(CreateFlags.AllImplicit);
}