2017-09-19 7 views
0

my関数の結果は、常にxID列の一意のIDを持つことです。私の「名前」列は一意であることに制約され、xIDは一次で自動割り当てされます。データベースをチェックし、利用できない場合に追加する最も効率的な方法

def getid(x): 
    cursor.execute('''SELECT xID 
      FROM table 
      WHERE Name = '{}';''' 
        .format(x)) 
    if cursor.rowcount == 0: 
     cursor.execute('''INSERT INTO table 
          (Name) 
          VALUES ({0});''' 
         .format(x)) 
     cursor.commit() 
    cursor.execute('''SELECT xID 
      FROM table 
      WHERE Name = '{}';''' 
        .format(x)) 
    return cursor.fetchone()[0] 
    cursor.close() 

この構造は、しかし、それが不必要に代表信頼性の高いようです:

は、ここに私の現在の関数です。これを達成するためのより速い方法がありますか?ソリューション提案

def getid(x): 
    sql = '''INSERT INTO table ([Name]) 
      SELECT %s 
      WHERE NOT EXISTS (SELECT 1 FROM table WHERE [Name] = %s)''' 

    cursor.execute(sql, (x,x)) 

    sql = '''SELECT xID 
       FROM table 
       WHERE Name = '%s';''' 

    cursor.execute(sql, (x,)) 

    return cursor.fetchone()[0] 
    cursor.close() 

答えて

1

はSQLでNOT EXISTS句を検討し、代わりに.format()の文字列補間のパラメータを渡すようにしてください。

sql = '''INSERT INTO table ([Name]) 
SELECT %s 
WHERE NOT EXISTS (SELECT 1 FROM table WHERE [Name] = %s)''' 

cursor.execute(sql, (x,x)) 
+0

入力いただきありがとうございますが、これは機能しません - 私は値を選択することはできません、それは列でなければなりません。 – brddawg

+0

本当ですか?この[rextester demo](http://rextester.com/ZXV86001)を見ると、SQL Serverで 'FROM'を使わないでスカラー値で' NOT EXISTS'を使うことができます。デモでは、 'Z'が追加されていますが、' A'は追加されていません。 – Parfait

+0

データベース接続とこのメソッドに問題がありました。これはSQLでは実行されますが、IDEでは実行されません。 – brddawg

関連する問題