12

我正在开发一个拼字游戏程序

在一些示例之后,我有以下代码,它使用 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()
4

4 回答 4

19

您要查找的查询是:

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”子句,仍然会返回错误。

于 2013-10-27T19:20:44.927 回答
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

我相信如果它已经存在,您可以跳过错误并直接插入数据

于 2014-06-20T17:13:14.127 回答
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
于 2016-12-24T23:40:19.987 回答
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)
于 2021-02-07T22:04:44.857 回答