我如何可靠地在SQLite中检查特定的用户表是否存在?
我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)
原因如下:
在我的程序中,我需要创建并填充一些表,如果它们还不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?
或者我的方法有意义吗?
我如何可靠地在SQLite中检查特定的用户表是否存在?
我并不是要求使用不可靠的方法,比如检查表上的“select *”是否返回错误(这是一个好主意吗?)
原因如下:
在我的程序中,我需要创建并填充一些表,如果它们还不存在的话。
如果它们已经存在,我需要更新一些表。
我是否应该采取其他路径来表示已经创建了相关的表-例如,通过在磁盘上的程序初始化/设置文件中创建/放置/设置某个标志?
或者我的方法有意义吗?
当前回答
如果你处理Big Table,我用Python和Sqlite做了一个简单的hack,你可以用任何其他语言做出类似的想法
步骤1:不要在create table命令中使用(如果不存在)
您可能知道,如果您之前已经创建了这个表,并且想要重新创建它,那么运行这个命令将会有一个异常,但这将引导我们进入第二步。
步骤2:使用try和except(或其他语言的try和catch)来处理最后一个异常
在这里,如果您之前没有创建表,则try case将继续执行,但如果您已经创建了,则可以将do your process置于except case,您将知道您已经创建了表。
代码如下:
def create_table():
con = sqlite3.connect("lists.db")
cur = con.cursor()
try:
cur.execute('''CREATE TABLE UNSELECTED(
ID INTEGER PRIMARY KEY)''')
print('the table is created Now')
except sqlite3.OperationalError:
print('you already created the table before')
con.commit()
cur.close()
其他回答
class CPhoenixDatabase():
def __init__(self, dbname):
self.dbname = dbname
self.conn = sqlite3.connect(dbname)
def is_table(self, table_name):
""" This method seems to be working now"""
query = "SELECT name from sqlite_master WHERE type='table' AND name='{" + table_name + "}';"
cursor = self.conn.execute(query)
result = cursor.fetchone()
if result == None:
return False
else:
return True
注意:现在在我的Mac上使用Python 3.7.1
我错过了FAQ条目。
不管怎样,为了将来的参考,完整的查询是:
SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';
其中{table_name}是要检查的表的名称。
参考文档部分:数据库文件格式。SQL数据库模式的存储
这将返回指定名称的表列表;也就是说,游标的计数将为0(不存在)或1(确实存在)
在swift的数据库中,表是否存在
func tableExists(_ tableName:String) -> Bool {
sqlStatement = "SELECT name FROM sqlite_master WHERE type='table' AND name='\(tableName)'"
if sqlite3_prepare_v2(database, sqlStatement,-1, &compiledStatement, nil) == SQLITE_OK {
if sqlite3_step(compiledStatement) == SQLITE_ROW {
return true
}
else {
return false
}
}
else {
return false
}
sqlite3_finalize(compiledStatement)
}
我想补充Diego Vélez关于PRAGMA声明的回答。
从https://sqlite.org/pragma.html我们可以得到一些有用的函数,可以返回关于我们数据库的信息。 在此,我引用以下内容:
例如,索引中有关列的信息可以使用index_info pragma读取,如下所示: 编译指示index_info(“idx52”); 或者,可以使用以下方法读取相同的内容: SELECT * FROM pragma_index_info('idx52'); 表值函数格式的优点是查询可以只返回PRAGMA列的一个子集,可以包含WHERE子句,可以使用聚合函数,并且表值函数可以只是连接中的几个数据源之一……
Diego的回答给了PRAGMA table_info(table_name)一个选项,但这在您的其他查询中没有多大用处。
所以,要回答OPs问题并改进diego的回答,你可以做
SELECT * FROM pragma_table_info('table_name');
或者更好,
SELECT name FROM pragma_table_list('table_name');
如果你想模仿poorluzer投票最多的答案。
我想我要对这个讨论发表我的意见,即使这是一个相当老的问题。 如果表存在,该查询返回标量1,否则返回0。
select
case when exists
(select 1 from sqlite_master WHERE type='table' and name = 'your_table')
then 1
else 0
end as TableExists