2013-10-27 7 views
11

私はscrabblecheatプログラムで作業していますテーブルが既に存在するかどうかをテストするには?

いくつかの例の後に、以下のコードを使用して、簡単なデータベースで私の言葉を保存します。

しかし、私はデータベーステーブルを再作成できないと伝えます。

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() 

答えて

13

あなたが探しているクエリは次のとおりです。だから、

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) 

documentationから:

It is usually an error to attempt to create a new table in a database that already contains a table, index or view of the same name. However, if the "IF NOT EXISTS" clause is specified as part of the CREATE TABLE statement and a table or view of the same name already exists, the CREATE TABLE command simply has no effect (and no error message is returned). An error is still returned if the table cannot be created because of an existing index, even if the "IF NOT EXISTS" clause is specified.

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

私はそれが既に存在する場合は、単にエラーをスキップし、直接データの挿入に移動することができます

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 
+0

であるあなたが – flaschbier

+1

を修正し、あなたの例の呼び出しでisTableへの接続を渡すのを忘れて。ありがとうございます。でも、あなた自身で答えを自由に修正してください。 – jdr5ca

関連する問題