2016-09-30 18 views
0

まず、私は本当に新しいですので、質問を正しく投稿できるようになることを願っています。何か問題があれば教えてください。sqlite3が存在しない場合(Pythonを使用)

ここで私の質問です:私はそれがまだ存在しない場合にのみ、データでデータベースを埋めたいと思います。このトピックを検索したところ、正しい答えが見つかったと思いますが(ここでは一例を読むことができます:["Insert if not exists" statement in SQLite)、これらの単純なコマンドラインをPythonで書く必要があります。そう基本的に私はいくつかあると思い

[ERROR] behavior.box :_safeCallOfUserMethod:125 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1142022496:/ProSolutDB_11: Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/albehavior.py", line 113, in _safeCallOfUserMethod  func(functionArg) File "<string>", line 45, in onInput_onStart OperationalError: near "WHERE": syntax error 

self.cur.execute("INSERT INTO ProSolut VALUES('a','b','c')") 
    self.cur.execute("SELECT * FROM ProSolut") 
    self.cur.execute("WHERE NOT EXISTS (SELECT * FROM ProSolut WHERE VALUES = ('a','b','c'))") 

を、ここでエラーです:

だから、ここで私がやったことです(私もPythonで非常に新しいですと予想します) "(" OperationalError:near "WHERE":構文エラー ")

私はおそらくそれは愚かなエラーだと私は知っているでしょうか? 私を助けることができる場合は、本当に感謝します。

はあまり


例えば:私は、私はすべての機能ブロックを構築するためにPython言語を使用していますソフトウェアChoregrapheを、使用していますと言うのを忘れてありがとう。 つまり、言語が基本的にPythonであっても、意味が完全に同じではないことがあります。 この投稿が今後誰かを助けることができたら幸いです。

+0

SQLステートメントは1つだけ使用してください。 – Matthias

+0

全く異なるSQLコマンドを使用しています。 VALUES句とFROM句が間違っています。 –

+0

お互いありがとうございます..時間があれば本当に参考になります:) – mruocco

答えて

1

bは「Col2に」であるとcは「COL3」であり、以下はSの存在を確認する必要があり、aは「のCol1」という列であると仮定すると、行UCH:

self.cur.execute('SELECT * FROM ProSolut WHERE (Col1=? AND Col2=? AND Col3=?)', ('a', 'b', 'c')) 
entry = self.cur.fetchone() 

if entry is None: 
    print 'No entry found' 
else: 
    print 'Entry found' 

これは、これらの値と一致ProSolutのすべてのエントリを選択します。fetchoneはこのクエリの結果を取得しようとします。一致しない場合はNoneを返します。

EDIT:Barmarさんのコメントに沿って、次のように適応する、これは値を挿入するには:

self.cur.execute('SELECT * FROM ProSolut WHERE (Col1=? AND Col2=? AND Col3=?)', ('a', 'b', 'c')) 
entry = self.cur.fetchone() 

if entry is None: 
    self.cur.execute('INSERT INTO ProSolut (Col1, Col2, Col3) VALUES (?,?,?)', ('a', 'b', 'c')) 
    print 'New entry added' 
else: 
    print 'Entry found' 

あなたはあまりにもあなたの変更をcommit()を確認する必要があります!

+0

どこに 'INSERT'文がありますか? – Barmar

+0

ありがとうございます!それは完全に働いた! – mruocco

1

まず、すべてを1つのself.cur.execute()コールにまとめる必要があります。これに対する各呼び出しは、完全な照会でなければならず、互いに連結されていません。

第二に、あなたはそれがどちらか一方にする必要があり、 INSERTクエリ内のデータのソースとしてVALUESSELECTの両方を持つことはできません。

第3に、WHERE式に一致するテーブルのすべての行に新しい行を挿入するため、データのソースとしてテーブルから選択したくないWHERE式は、選択されている行の中の何も参照しません)。値だけを選択したいだけです。

this.cur.execute(""" 
    INSERT INTO ProSolut (col1, col2, col3) 
    SELECT 'a', 'b', 'c' 
    WHERE NOT EXISTS (SELECT * FROM ProSolut WHERE col1 = 'a', col2 = 'b', col3 = 'c'; 
    """) 

あなたが記入している列の実際の名前でcol1col2col3を交換してください。

いずれかまたはすべての列は、テーブル内の一意のキーであれば、あなただけのINSERT OR IGNOREを使用することができます:

this.cur.execute(""" 
    INSERT OR IGNORE INTO ProSolut (col1, col2, col3) 
    VALUES ('a', 'b', 'c'); 
    """); 
+0

これは、私が自分の答えを構築していて、より包括的に見えるようになったときに現れたものです。 – asongtoruin

+0

問題はChoregrapheでちょっと違うかもしれませんが、私はこのコードをどれくらい適応できるかチェックします。ありがとうございます。 – mruocco

関連する問題