12

私は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()
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 に答える