Python SQLAlchemy: ¿Reflejar la base de datos rompe los métodos predeterminados / actualizados?
Tengo dos interfaces SQLAlchemy separadas para una base de datos Postgres. La primera interfaz, en el contexto de una aplicación Flask, contiene este modelo:
app = create_app() # sets the SQLAlchemy Database URI, etc.
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.utcnow)
name = db.Column(db.String, nullable=False)
La segunda interfaz no es a través de Flask, sino que es un script que escucha un evento en particular, en cuyo caso está destinado a realizar algunos cálculos y actualizar una fila en la base de datos. Para lograr esto, tengo SQLAlchemy que refleja la base de datos existente:
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.orm import mapper, sessionmaker
from sqlalchemy.ext.automap import automap_base
from os import environ
dbPath = "postgresql://" + ...
engine = create_engine(dbPath)
Base = automap_base()
Base.prepare(engine, reflect=True)
metadata = MetaData(engine)
class User(object):
pass
users = Table('user', metadata, autoload=True, autoload_with=engine)
mapper(User, users)
Session = sessionmaker(bind=engine)
session = Session()
El problema con el que me encuentro ahora es este: cuando estoy usando la primera interfaz para crear una nueva entrada o actualizar una, las cosas funcionan como se esperaba, y elcreated_at
yupdated_at
los campos se actualizan adecuadamente.
Sin embargo, cuando estoy usando la segunda interfaz, importando el código y usandosession.query(User)
para obtener una entrada y actualizarla, laupdated_at
El campo no cambia. Además, cuando uso esta interfaz para crear un nuevo Usuario, mientras crea la nueva fila como se esperaba, no llena ni elcreated_at
niupdated_at
campos.
Mis preguntas:
¿Por qué está pasando esto? ¿Por qué el reflejo aparentemente rompe eldefault/onupdate
métodos?¿Cómo puedo arreglar esto?