代码之家  ›  专栏  ›  技术社区  ›  CL So

如何在Alchemy中创建生成列?

  •  0
  • CL So  · 技术社区  · 5 年前

    这个SQL还可以

    CREATE TABLE `calendar` (
      `dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `d` date as (dt),
      `t` time as (dt)
    );
    

    class Calendar(db.Model):
        __table_args__ = {'mysql_collate': 'utf8_general_ci', 'mysql_engine':'InnoDB'}
    
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        dt = db.Column(db.DateTime, nullable=False, server_default=db.func.current_timestamp())
        d = ???
        t = ???
    
    db.create_all()
    

    这是一个错误

    class Calendar(db.Model):
        __table_args__ = {'mysql_collate': 'utf8_general_ci', 'mysql_engine':'InnoDB'}
    
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        dt = db.Column(db.DateTime, nullable=False, server_default=db.func.current_timestamp())
        d = db.ColumnProperty(db.Date,dt)
        t = db.ColumnProperty(db.Time,dt)
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Asmus    5 年前

    确切地 hybrid_property 反而( see documentation here

    from sqlalchemy.ext.hybrid import hybrid_property
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, Float, Dat
    from datetime import datetime
    
    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True)
        firstname = Column(String(50))
        lastname = Column(String(50))
        birthdate = Column(DateTime, nullable=False, )
    
        @hybrid_property
        def birthyear(self):
            return self.birthdate.strftime("%Y/%m/%d")
        @hybrid_property
        def birthtime(self):
            return self.birthdate.strftime("%H:%M:%S")
    
    us=User(firstname="Jon", lastname="Snow",birthdate=datetim
    
    print( us.firstname,us.lastname,us.birthyear,us.birthtime)
    
        2
  •  0
  •   CoolCoder    3 年前

    这对我有用

    geom
    expire_on_flush 避免在计算列中进行指令或更新。

    distance = column_property(db.Column(db.Float,Computed("Round((st_length(geom,false)::numeric /1000),2)",True),nullable=True),expire_on_flush= True)