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.