繁体   English   中英

如何在 Flask-SQLAlchemy 中创建生成列?

[英]How to create generated column in Flask-SQLAlchemy?

这个SQL没问题

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

如何在 Flask-SQLAlchemy 中创建这个表?

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)

也许这不是您想要的,但仍然:我建议改用hybrid_property请参阅此处的文档),如下所示:

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=datetime(1986, 12, 26, 23, 59, 59))

print(us.firstname, us.lastname, us.birthyear, us.birthtime)

这对我有用

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)

希望它有效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM