Python 使用SqlAlchemy插入MySQL时间戳列值

Python 使用SqlAlchemy插入MySQL时间戳列值,python,mysql,sqlalchemy,timestamp,Python,Mysql,Sqlalchemy,Timestamp,我有一个sqlalchemy类映射到MySQL innoDB中的数据库表。该表有多个列,我能够成功地填充所有列,但时间戳列除外: 映射: class HarvestSources(Base): __table__ = Table('harvested', metadata, autoload=True) MySQL上的列是一个时间戳,其默认值为CURRENT_TIMESTAMP,但是当我插入一行时,它被NULL填充 如果默认设置不起作用,那么我需要手动设置时间戳,我如何才能执行这两项操

我有一个sqlalchemy类映射到MySQL innoDB中的数据库表。该表有多个列,我能够成功地填充所有列,但时间戳列除外:

映射:

class HarvestSources(Base):
    __table__ = Table('harvested', metadata, autoload=True)
MySQL上的列是一个时间戳,其默认值为CURRENT_TIMESTAMP,但是当我插入一行时,它被NULL填充

如果默认设置不起作用,那么我需要手动设置时间戳,我如何才能执行这两项操作

要将行插入表的SqlAlchemy代码:

source = HarvestSources()
source.url = url
source.raw_data = data
source.date = ?

DB.session.add(source)
DB.session.commit()

datetime
对象被转换为时间戳,因此您只需使用:

from datetime import datetime
...
source.date = datetime.now()

或者
datetime.utcnow()
如果要使用utc保存它。默认(
CURRENT\u TIMESTAMP
)使用本地时区,因此
datetime.now()
更接近于此-但它几乎总是更倾向于以UTC格式存储与时间相关的数据,并且仅在向用户提供数据时才进行时区转换。

mata的答案非常清楚如何添加时间戳值。如果要在
插入
更新
上添加自动添加的时间戳
。您可以考虑使用BasyMyCin类,并登记每个类的SqLalCyMy事件。实施示例如下:

class BaseMixin(object):

  __table_args__ = {'mysql_engine': 'InnoDB'}

  id = sa.Column(sa.Integer, primary_key=True)
  created_at = sa.Column('created_at', sa.DateTime, nullable=False)
  updated_at = sa.Column('updated_at', sa.DateTime, nullable=False)

  @staticmethod
  def create_time(mapper, connection, instance):
     now = datetime.datetime.utcnow()
     instance.created_at = now
     instance.updated_at = now

  @staticmethod
  def update_time(mapper, connection, instance):
     now = datetime.datetime.utcnow()
     instance.updated_at = now

  @classmethod
  def register(cls):
     sa.event.listen(cls, 'before_insert', cls.create_time)
     sa.event.listen(cls, 'before_update', cls.update_time)
将您的
类HarvestSources(Base):
更改为
类HarvestSources(Base,BaseMixin):
。 在您的模型初始化上调用
harvedsources.register()
。在
处更新的
和在
处创建的
列将自动更新