2017-03-17 9 views
1

私は、Oracle DBのpythonはRuntimeError:

sql = """INSERT INTO app_mobile_scout 
    (type_event, date_event, version_app, UUID, name_event, description, device_model, IMEI, ip_device). 
    values ('%s', to_date('%s', "yyyy/mm/dd hh24:mi:ss"), '%s', '%s', '%s', '%s', '%s', '%s', '%s')"""%(type_event, date_event, version_app, UUID, name_event, description, device_mod 
    res = cur.execute(sql) 

に日付を書き込むしようとして置き換えるために、 "MI" は見つからなかったと私はエラーがあります:

RuntimeError: "mi" not found for replace in "INSERT INTO app_mobile 
    (type_event, date_event, version_app, UUID, name_event, description, device_model, IMEI, ip_device). 
    values ('2', to_date('2017/03/16 11:46:06', "yyyy/mm/dd hh24:mi:ss"), '4.0.4',...... 

私が間違っているのは何を?

+0

あなたのSQL文を作成するために、文字列フォーマットを使用していないと起動することができます倍にしているようです。これは、SQLインジェクション攻撃まであなたを開きます。それはよくある質問ではありませんが、あなたがすべきことを示しています:https://wiki.python.org/moin/DbApiFaq。また、いくつかのデータベースでは、Pythonとは異なる方法で引用符を扱いますが、Oracleもそうです。 – jszakmeister

答えて

1

、。

values ('%s', to_date('%s', 'yyyy/mm/dd hh24:mi:ss') 
#       ^     ^

また、コードはprone to SQL injectionです。 Bind variablesではなく:

# Note: Doesn't work yet. 
cursor.execute(""" 
    INSERT INTO app_mobile_scout (
     type_event, 
     date_event, 
     version_app, 
     -- etc 
    ) VALUES (
     :type,  -- <-- use the variable 'type' here. 
     to_date(:date, 'YYYY/MM/DD HH24:MI:SS'), 
     :version, 
     -- etc 
    ); 
""", { 
    'type': type_event, # <-- bind `type_event` to the variable 'type' 
    'date': date_event, 
    'version': version, 
    # etc. 
}) 

は今、いくつかの未知の理由で、Oracleデータベースは、OPで見られるエラーの原因となって、プレースホルダとして文字列内部:MI:SSを解釈しています。私はこれがOracle側のバグだと思う。 OPによって確認されたように、働いたアラウンドすることができ、「エスケープ」コロンで、それは

 to_date(:date, 'YYYY/MM/DD HH24::MI::SS'), 
+0

RuntimeError:INSERT INTOのapp_mobile (type_event、date_event、version_app、UUID、name_event、description、device_model、IMEI、ip_device)の置換で "MI"が見つかりませんでした 値(:type_event、to_date(:date_event、 'YYYY/MM/DD HH24:MI:SS ')、:version_app、:UUID、:name_event、:説明、:device_model、:IMEI、:ip_device)」を選択します。 'version_app'、 'date_event'、 'IMEI'、 'UUID'、 'device_model'、 'description'、 'ip_device'、 'name_event'、 'type_event'のいずれかである必要があります – Rainmaker

+1

@Rainmaker httpの問題のようです://stackoverflow.com/questions/7342642/oracle-pl-sql-how-to-escape-colon-being-misinterpreted-for-bind-variable。私は今、Oracle DBをテストする必要はありませんが、 'HH24 :: MI :: SS'または' HH24 \\:MI \\:SS'を試したらどうでしょうか? – kennytm

+0

ダブルコロンは素晴らしい作品です!ありがとうございました! – Rainmaker

1

Pythonとは異なり、Oracle DBは一重引用符'を二重引用符"と解釈しません。

あなたの場合、日付書式は二重引用符で囲まれていますが間違っています。言い換えれば

、変更: [...], to_date('2017/03/16 11:46:06', "yyyy/mm/dd hh24:mi:ss"), [...] [...], to_date('2017/03/16 11:46:06', 'yyyy/mm/dd hh24:mi:ss'), [...]


へのOracle DBに二重引用符対単一引用符について:あなたがすべきSQL use single quotes for strings. Double quotes are for identifiersでまず https://community.oracle.com/message/3853568#3853568

+0

私はそれをto_date( '2017/03/16 11:46:06'、 'yyyy/mm/dd hh24:mi:ss')に変更しましたが、結果は同じです – Rainmaker

+1

この新しい試行を追加して更新できますか+新しいエラー? – pltrdy

+0

同じエラーです。絶対に – Rainmaker

関連する問題