Python 使用SqlAlchemy插入MySQL时间戳列值
我有一个sqlalchemy类映射到MySQL innoDB中的数据库表。该表有多个列,我能够成功地填充所有列,但时间戳列除外: 映射: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填充 如果默认设置不起作用,那么我需要手动设置时间戳,我如何才能执行这两项操
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()
。在
处更新的和在
处创建的列将自动更新