mysqldb from example create_engine python mysql sqlalchemy timestamp

python - from - sqlalchemy flask mysql



Insertar valor de columna de marca de tiempo MySQL con SqlAlchemy (2)

Tengo una asignación de clase sqlalchemy a una tabla de base de datos en MySQL innoDB. La tabla tiene varias columnas y puedo completarlas satisfactoriamente todas, excepto desde una columna TIMESTAMP:

El mapeo:

class HarvestSources(Base): __table__ = Table(''harvested'', metadata, autoload=True)

La columna en MySQL es un TIMESTAMP que tiene CURRENT_TIMESTAMP como valor predeterminado, pero cuando inserto una fila, se llena con NULL.

Si el valor predeterminado no funciona, entonces tengo que configurar manualmente la marca de tiempo, ¿cómo podría hacer cualquiera de ellos?

Código SqlAlchemy para insertar una fila en la tabla:

source = HarvestSources() source.url = url source.raw_data = data source.date = ? DB.session.add(source) DB.session.commit()


datetime objetos datetime se convierten a marcas de tiempo, por lo que puede usar:

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

o datetime.utcnow() si desea guardarlo usando utc. El valor predeterminado ( CURRENT_TIMESTAMP ) utiliza la zona horaria local, por lo que datetime.now() está más cerca de eso, pero casi siempre debería ser preferible almacenar datos relacionados con el tiempo en UTC, y hacer conversiones de zona horaria solo cuando se presentan datos al usuario.


La respuesta mata es muy clara sobre cómo agregar un valor de marca de tiempo. Si desea agregar la marca de tiempo agregada automatically al insert y update . Puede considerar tener una clase BaseMixin y registrar el evento sqlalchemy para cada clase. Ejemplo de implementación a continuación:

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)

cambie su class HarvestSources(Base): a class HarvestSources(Base, BaseMixin): llame a HarvestSources.register() en su modelo init. La columna updated_at y created_at se actualizará automáticamente.