2

パッケージを使用してmysqlデータベースにレコードを挿入しようとしています。pythonsqlalchemy

datetimeload table inline コマンドを介して次の形式のデータを既に受け入れている mysql で入力された列があります。

'2013-04-03 00:05:00-05:00'

これはpytzPython のモジュールによって生成されることに注意してください。load table inline <file_name>コマンドを使用して、mysql コンソールからまったく同じ形式の日時スタンプを含む 600,000 行を問題なくロードできました。MySql はロード時にそれらを受け入れますが、タイムゾーン情報を保持しているかどうかはわかりません。私が興味を持っている他のタイムゾーンの日時を表す3つの他の列があるので、それは私にとって本当に重要ではありません. . 対象のタイム ゾーンを表す列が既にあるため、mysql でタイム ゾーンの変換を行うことはありません。

これは、mysql のドキュメントによると次のとおりです。

The DATETIME type is used for values that contain both date and time parts. MySQL
retrieves and displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format. The supported
range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. 

モジュールは、pytz挿入しようとしている日時スタンプのタイムゾーンに関する情報を提供します。実際には 4 つの列(EST, UTC, EST/EDT and CST/CDT)があるため、すべてのタイム ゾーン情報が日時スタンプに埋め込まれています。

カスタムINSERTクエリを使用していないことに注意してください。これは、sqlalchemy が多数の挿入を実行するデフォルトの方法です。

挿入を実行する関数は次のようになります。

def insert_data(data_2_insert, table_name):
    # Connect to database using SQLAlchemy's create_engine()
    engine = create_engine('mysql://blah:blah@localhost/db_name')
    # Metadata is a Table catalog. 
    metadata = MetaData()
    my_table = Table(table_name, metadata, autoload=True, autoload_with=engine)
    column_names = tuple(c.name for c in my_table.c)
    final_data = [dict(zip(column_names, x)) for x in data_2_insert]
    ins = my_table.insert()
    conn = engine.connect()
    conn.execute(ins, final_data)
    conn.close()

エラーメッセージ:

   Traceback (most recent call last):
      File "script.py", line 191, in <module>
        main()
      File "script.py", line 39, in main
        insert_data(file_csv, table_name)
      File "script.py", line 58, in insert_data
        conn.execute(ins, final_data)
      File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 824, in execute
        return Connection.executors[c](self, object, multiparams, params)
      File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 874, in _execute_clauseelement
        return self.__execute_context(context)
      File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 894, in __execute_context
        self._cursor_executemany(context.cursor, context.statement, context.parameters, context=context)
      File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 960, in _cursor_executemany
        self._handle_dbapi_exception(e, statement, parameters, cursor, context)
      File "/usr/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 931, in _handle_dbapi_exception
        raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
    sqlalchemy.exc.OperationalError: (OperationalError) (1292, "Incorrect datetime value: '2013-04-03 00:05:00-05:00' for column 'rtc_date_est' at row 1")
4

1 に答える 1

1

SQLAlchemy は MySQL DATETIME 形式を尊重していないようです。SQLAlchemy はタイムゾーン対応の形式を MySQL DATETIME に入れようとしていますが、これは行ごとにタイムゾーンをサポートしていません。

解決策は、datetime オブジェクトからタイムゾーン情報を削除することです。それらを MySQL のデフォルト (UTC、EST など) に一致するタイムゾーンに変換した後、次の手順を実行します。

date_value = date_value.replace(tzinfo=None)

ここで、date_value は SQLAlchemy オブジェクトに渡される datetime オブジェクトです。

于 2015-05-20T02:04:10.960 に答える