2016-11-03 2 views
0

大きなリストからcx_oracleを使用して複数のタイムスタンプクエリを送信しようとしています。私はarticle実行ごとに1つのクエリを送信して見てきましたが、私はexecutemanyを使用して複数を実行するとどの例も見ていません。複数のタイムスタンプのリストをどのように取得するのですか?私は以下を作ったが、運はなかった!私が接続していcx_oracle.execute_manyを使用して複数のタイムスタンプクエリを含むリストを送信

import datetime 
import cx_Oracle 

listrows =[ 

    [56, 'steveJob', 'Apple', '2016-08-15 20:23:03.317909', '2015-09-08 20:46:30.456299', ''], 
    [32, 'markZuck', 'Faceb', '2015-09-08 20:46:30.456299', '2015-09-08 20:46:30.456299', ''], 
    [45, 'elonMusk', 'Tesla', '2016-02-18 16:53:20.959984', '2016-02-18 17:17:05.664715', ''] 

] 

con = cx_Oracle.connect("system","oracle","localhost:1521/xe.oracle.docker") 
cursor = con.cursor() 
cursor.prepare("""INSERT INTO lifexp (age, name, lastcompany, created_at, deleted_at, turnout) VALUES (:1,:2,:3,:4,:5,:6)""") 

cursor.setinputsizes(cx_Oracle.TIMESTAMP) 
cursor.executemany(None, listrows) 
con.commit() 
cursor.close() 
con.close() 

私のテーブルには、このようセットアップです:

TypeError: expecting timestamp data

私はライン「cursor.setinputsizesを削除(cx_Oracle:

CREATE TABLE lifexp(
    age NUMBER (19,0) primary key, 
    name VARCHAR(256), 
    lastcompany VARCHAR(256), 
    created_at timestamp, 
    deleted_at timestamp, 
    turnout timestamp 
); 

私はエラーを取得します。 TIMESTAMP) "私は得る:

cx_Oracle.DatabaseError: ORA-01843: not a valid month

+0

タイムスタンプクエリのリストまたはタイムスタンプ値のリスト? –

+0

@DanBracuk文字列と数字の混合リスト2はタイムスタンプ値文字列で、1はヌルタイムスタンプ値文字列( '')です。 –

答えて

2

問題はタイムスタンプ値ではなく文字列を送信していることを確認してください。したがって、setinputsizes()を使用している場合は、cx_Oracleにタイムスタンプ値を与えるよう指示していますが、それらを提供していません。 setinputsizes()コールがなければ、これらの文字列をタイムスタンプ値に変換するようOracleに指示しますが、デフォルトのタイムスタンプ形式は渡す日付の形式と一致しません。あなたは(a)のdatetime.datetimeの値はPythonにあなたの文字列を変換したり、(b)はPythonのdatetime.datetimeの値に文字列を変換するSQL文では

を変換を指定する必要がありますいずれか

は十分に簡単です:

datetime.datetime.strptime("2016-08-15 20:23:03.317909", "%Y-%m-%d %H:%M:%S.%f") 

SQLステートメントでの変換の指定もかなり簡単です。

cursor.prepare(""" 
     insert into lifexp 
     (age, name, lastcompany, created_at, deleted_at, turnout) 
     VALUES (:1,:2,:3, 
      to_timestamp(:4, 'YYYY-MM-DD HH24:MI:SS.FF'), 
      to_timestamp(:5, 'YYYY-MM-DD HH24:MI:SS.FF'):6)""") 

私は最初の選択肢が優れていると思いますが、どちらも効果的です。

関連する問題