我正在制作一个scrabblecheat计划
根据一些例子,我在下面的代码中使用了SQLite来存储我的单词的简单数据库。
然而它告诉我无法重新创建数据库表。
如果已经有一个名为spwords
的表格,我该怎么写支票,然后跳过尝试创建它?
错误:
(<class 'sqlite3.OperationalError'>, OperationalError('table spwords already exists',), None)
守则:
def load_db(data_list):
# create database/connection string/table
conn = sqlite.connect("sowpods.db")
#cursor = conn.cursor()
# create a table
tb_create = """CREATE TABLE spwords
(sp_word text, word_len int, word_alpha text, word_score int)
"""
conn.execute(tb_create) # <- error happens here
conn.commit()
# Fill the table
conn.executemany("insert into spwords(sp_word, word_len, word_alpha, word_score) values (?,?,?,?)", data_list)
conn.commit()
# Print the table contents
for row in conn.execute("select sp_word, word_len, word_alpha, word_score from spwords"):
print (row)
if conn:
conn.close()
答案 0 :(得分:15)
您正在寻找的查询是:
SELECT name FROM sqlite_master WHERE type='table' AND name='spwords'
因此,代码应如下所示:
tb_exists = "SELECT name FROM sqlite_master WHERE type='table' AND name='spwords'"
if not conn.execute(tb_exists).fetchone():
conn.execute(tb_create)
SQLite 3.3+的一个方便的替代方法是使用更智能的查询来代替创建表:
CREATE TABLE IF NOT EXISTS spwords (sp_word text, word_len int, word_alpha text, word_score int)
尝试在已包含同名的表,索引或视图的数据库中创建新表通常是错误的。但是,如果将“IF NOT EXISTS”子句指定为CREATE TABLE语句的一部分并且已存在同名的表或视图,则CREATE TABLE命令将无效(并且不会返回任何错误消息)。如果由于现有索引而无法创建表,则仍会返回错误,即使指定了“IF NOT EXISTS”子句也是如此。
答案 1 :(得分:2)
conn = sqlite3.connect('sowpods.db')
curs = conn.cursor()
try:
curs.execute('''CREATE TABLE spwords(sp_word TEXT, word_len INT, word_alpha TEXT,word_score INT)''')
conn.commit()
except OperationalError:
None
https://docs.python.org/2/tutorial/errors.html
我相信如果它已经存在,你可以跳过错误并直接进入数据插入
答案 2 :(得分:1)
我不是反对CREATE关闭数据库方法的粉丝。您应该知道表是否存在,以便第一次进行初始化。
这是基于相同查询的答案,但基于通用功能:
def getTables(conn):
"""
Get a list of all tables
"""
cursor = conn.cursor()
cmd = "SELECT name FROM sqlite_master WHERE type='table'"
cursor.execute(cmd)
names = [row[0] for row in cursor.fetchall()]
return names
def isTable(conn, nameTbl):
"""
Determine if a table exists
"""
return (nameTbl in getTables(conn))
现在顶级代码是
if not(isTable(conn, 'spwords')):
# create table and other 1st time initialization
答案 3 :(得分:0)
以下示例展示了如何干净地使用 fetchone()
调用的结果:
table_exists(conn:sqlite3.Connection, tbl_name:string) -> bool:
(count,) = conn.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='{}'".format(tbl_name)).fetchone()
return (count > 0)