【发布时间】:2020-02-02 13:25:42
【问题描述】:
我第一次使用 SQLAlchemy 和 Flask 创建 API,我正在尝试使用 Entity Framework 做一些我之前在 .NET 中做过很多次的事情,即为我创建一个模型将视图和表中的列组合在一起的 CRUD 操作。我想知道是否可以这样做,或者我想要做的不是在 Flask/SQLAlchemy 中执行此操作的“正确”方法。我也在使用 flask-sqlalchemy 库。
这里有两个模型:
class PigeonView(db.Model):
__table_args__ = {'info': dict(is_view=True)}
id = db.Column(db.Integer, db.ForeignKey('pigeon.id')
kick_events = db.Column(db.Integer)
class PigeonBase(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(255), nullable=False)
date_created = db.Column(db.DateTime, nullable=False)
Pigeon 映射到表,PigeonView 映射到视图(DB 是 mySQL)。
这是视图:
CREATE VIEW pigeon_view AS
SELECT
p.id AS id,
COALESCE(SUM(k.pigeon_id), 0) AS kick_events
FROM pigeon p
LEFT JOIN kick_event k
ON p.Id = k.pigeon_id GROUP BY p.Id
基本上,只有鸽子 ID 和鸽子被踢了多少次的整数。
(还有另一个名为 Kick Events 的模型/表格,此信息来自该模型/表格,如下所示)
class KickEvent(db.Model):
__tablename__ = "kick_event"
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
pigeon_id = db.Column(db.Integer, db.ForeignKey('pigeon.id'), primary_key=True)
date = db.Column(db.DateTime)
我想要的最终结果是一个鸽子模型,它包含 Pigeon 表中的所有内容以及 Pigeon 视图中的 kick_events 列。 (以及可能添加到鸽子视图中的任何其他变量)。
类似这样的:
class Pigeon(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True) #from pigeon table
name = db.Column(db.String(255), nullable=False) #from pigeon table
date_created = db.Column(db.DateTime, nullable=False) #from pigeon table
kick_events = db.Column(db.Integer) #from pigeon view
在 .NET / Entity Framework 中,我会做这样的事情来将这些属性映射到我的最终目标 Pigeon 类:
this.HasKey((x => x.Id));
this.Property(x => x.Name).HasColumnName("Name");
this.Property(x => x.DateCreated).HasColumnName("DateCreated");
this.Property(x => x.KickEvents).HasColumnName("KickEvents");
Map(m =>
{
m.Properties(p => new
{
p.Id,
p.Name,
p.DateCreated
});
m.ToTable("Pigeon");
});
Map(m =>
{
m.Properties(p => new
{
p.Id,
p.KickEvents
});
m.ToTable("PigeonView");
});
但我不确定如何使用 Python/SQLAlchemy 到达那里,因为整个过程显然与实体框架非常不同。
【问题讨论】:
标签: python flask sqlalchemy flask-sqlalchemy