首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql和python datetime

问mysql和python datetime
EN

Stack Overflow用户
提问于 2013-04-05 05:21:55
回答 1查看 3.1K关注 0票数 2

我正在尝试使用sqlalchemy包通过python将记录插入到mysql数据库中。

我在mysql中有一些datetime类型的列,它们已经通过load table行内命令接受了以下格式的数据:

代码语言:javascript
复制
'2013-04-03 00:05:00-05:00'

注意,这是由python中的pytz模块生成的。我可以使用load table inline <file_name>命令通过mysql控制台加载600,000行具有完全相同格式的日期时间戳。MySql在加载时接受它们,但我不确定它是否维护时区信息。这对我来说真的无关紧要,因为我have3其他列,这些列表示我感兴趣的其他时区中的日期时间。因此,我知道哪一列代表EST/EDT或CST/CDT,如果我愿意,我可以根据这一列进行查询。我不会在mysql中进行任何时区转换,因为我已经有了表示感兴趣的时区的列。

这是根据mysql的文档:

代码语言:javascript
复制
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),所以所有列的时区信息都嵌入到datetime戳中。

注意,我使用的不是自定义INSERT查询。这是sqlalchemy执行insert many的默认方式:

执行插入的函数如下所示:

代码语言:javascript
复制
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()

错误消息:

代码语言:javascript
复制
   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")
EN

回答 1

Stack Overflow用户

发布于 2015-05-20 10:04:11

看起来SQLAlchemy不支持MySQL DATETIME格式。SQLAlchemy正在尝试将时区感知的格式放入MySQL DATETIME中,而DATETIME不支持以行为单位的时区。

解决方案是从datetime对象中剥离时区信息。在将它们转换为与您的MySQL默认值(协调世界时、美国东部时间等)匹配的时区后,请执行以下操作:

代码语言:javascript
复制
date_value = date_value.replace(tzinfo=None)

其中,date_value是最终传递给SQLAlchemy对象的datetime对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15821953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档