Pao*_*aJ. 24 python sqlalchemy python-3.x
是否可以在SQLAlchemy中创建Column,它将在上次插入/更新时自动填充时间?我创建了继承自Base类的模型
class Base(object):
def __tablename__(self):
return self.__name__.lower()
id = Column(Integer, primary_key=True)
last_time = Column(TIMESTAMP, server_default=func.now())
Base = declarative_base(cls=Base)
class EntityModel(Base):
__tablename__ = 'entities'
settlement_id = Column(Integer, ForeignKey('settlements.id'), nullable=False)
type = Column(String(20), nullable=False)
level = Column(Integer, nullable=False, default=0)
energy = Column(Float, nullable=False, default=0)
position_x = Column(Integer, default=0)
position_y = Column(Integer, default=0)
def __repr__(self):
return "<Entity('%s')>" % (self.type)
Run Code Online (Sandbox Code Playgroud)
每当我更新EntityModel时,我想在系统function.now()上使用last_time.我可以使用触发器在数据库级别上执行此操作,但我宁愿在应用程序级别上执行此操作,如果可能的话.
tig*_*nk2 42
在Base类中,在最后一个语句中添加onupdate,如下所示:
last_time = Column(TIMESTAMP, server_default=func.now(), onupdate=func.current_timestamp())
Run Code Online (Sandbox Code Playgroud)
Rac*_*ers 12
如果您使用MySQL,我相信您只能有一个自动更新日期时间列,因此我们使用SQLAlchemy的事件触发器.
您只需将一个侦听器附加到'before_insert'和'before_update'挂钩并根据需要进行更新:
from sqlalchemy import event
@event.listen(YourModel, 'before_insert')
def update_created_modified_on_create_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the create/modified field accordingly."""
target.created = datetime.utcnow()
target.modified = datetime.utcnow()
@event.listen(YourModel, 'before_update')
def update_modified_on_update_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the modified field accordingly."""
# it's okay if this field doesn't exist - SQLAlchemy will silently ignore it.
target.modified = datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
我知道没有人会记得将它添加到新模型中,所以我试着变得聪明并为它们添加它.
我们所有的模型都继承自我们巧妙地称为"DatabaseModel"的基础对象.我们检查谁从这个对象继承并动态地将触发器添加到所有这些对象.
如果模型没有创建或修改的字段,那就没关系 - SQLAlchemy似乎默默地忽略它.
class DatabaseModel(db.Model):
__abstract__ = True
#...other stuff...
@classmethod
def _all_subclasses(cls):
""" Get all subclasses of cls, descending. So, if A is a subclass of B is a subclass of cls, this
will include A and B.
(Does not include cls) """
children = cls.__subclasses__()
result = []
while children:
next = children.pop()
subclasses = next.__subclasses__()
result.append(next)
for subclass in subclasses:
children.append(subclass)
return result
def update_created_modified_on_create_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the create/modified field accordingly."""
# it's okay if one of these fields doesn't exist - SQLAlchemy will silently ignore it.
target.created = datetime.utcnow()
target.modified = datetime.utcnow()
def update_modified_on_update_listener(mapper, connection, target):
""" Event listener that runs before a record is updated, and sets the modified field accordingly."""
# it's okay if this field doesn't exist - SQLAlchemy will silently ignore it.
target.modified = datetime.utcnow()
for cls in DatabaseModel._all_subclasses():
event.listen(cls, 'before_insert', update_created_modified_on_create_listener)
event.listen(cls, 'before_update', update_modified_on_update_listener)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12690 次 |
| 最近记录: |