Flask-SQLAlchemy多表对单模型

前言

在 Flask 中 Flask-SQLAlchemy 应该是最常用的 ORM 了,通过它来构建 Model 来映射数据库中的表。通常情况下都是一个表对应一个模型,这种方案很简单。那么如果是多个表对应一个模型的情况下,该如何处理呢?接下来结合一个具体的案例来讲解这一内容。

案例

现在我有一个数据库 test.db,它的表如下:

 

有很多表并且表名类似,而且表名类似的表的结构相同,以 UPS1_20190716 为例,看一下它的表结构:

Id
workTime
device
status
temp

那么如何定义Model呢?像下面这样?

class UPS120190719:
    __tablename__ = 'UPS1_20190716'
    Id = db.Column(db.Integer,primary_key=True)
    workTime = db.Column(db.Time)
    ...

class UPS220190716:
    __tablename__ = 'UPS2_20190716'
    ...

显然这样子代码不够优雅,有重复的代码,需要优化。那么该怎么解决呢?

解决方案

有俩种方案都可以解决上述问题,不过俩种方案应用场景略有不同,可以根据实际情况来决定。

类的继承

第一种方法就是利用类可以继承的特性去实现了,我们定义一个表的基类,然后其它 UPS 表继承 UpsBase即可::

class UpsBase:
    Id = db.Column(db.Integer,primary_key=True)
    workTime = db.Column(db.Time)
    ...

class UPS120190716(UpsBase):
    __tablename__ = 'UPS1_20190716'

class UPS220190716(UpsBase):
    __tablename__ = 'UPS2_20190716'

当表的数量固定这是一个很好的解决方案,但是一旦当数据库的表会发生变动,比如隔天增长几张表,显然我们不太可能天天定义新的Model,然后重新部署服务的。这个情况就需要用到第二种解决方案了。

动态定义表类

同样的这种方法也需要首先定义表的基类:

class UpsBase:
   Id = db.Column(db.Integer,primary_key=True)
   workTime = db.Column(db.Time)
   ...

但是这里就不需要定义其它 UPS 表的类了,这里是动态定义,那就意味着,我们只在需要的时候创建,那么如何创建呢?在 Python 中可以使用 type 函数动态创建类,需要注意的时,在创建时需要设置 __tablename__ 的值。

Ups1_20190716 = type('UPS120190716', (UpsBase, db.Model), {'__tablename__':'UPS1_20190716'})

之后就可以创建实例了:

Ups = Ups1_20190716()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flask-SQLAlchemy是一个基于FlaskPython Web开发框架,用于与SQLAlchemy集成的插件,可以轻松地在Flask应用程序中使用SQLAlchemy进行数据库操作。 以下是使用Flask-SQLAlchemy的基本步骤: 1. 安装Flask-SQLAlchemy 可以使用pip命令安装Flask-SQLAlchemy: ``` pip install Flask-SQLAlchemy ``` 2. 在Flask应用程序中配置数据库连接 在Flask应用程序中,需要配置数据库连接信息,例如: ``` from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/mydatabase' db = SQLAlchemy(app) ``` 以上代码中,'SQLALCHEMY_DATABASE_URI'是数据库连接的URL,可以根据自己的需要进行配置。在这个例子中,使用的是MySQL数据库。 3. 创建模型Flask-SQLAlchemy中,使用模型来表示数据库表。例如: ``` class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return '<User %r>' % self.username ``` 以上代码定义了一个名为“User”的模型,表示一个用户对象,包含id、username和email三个属性。 4. 数据库迁移 在使用Flask-SQLAlchemy时,可以使用Flask-Migrate插件进行数据库迁移。具体的步骤可以参考Flask-Migrate的文档。 5. 数据库操作 使用Flask-SQLAlchemy进行数据库操作非常简单,例如: ``` # 添加一个用户 user = User(username='john', email='john@example.com') db.session.add(user) db.session.commit() # 查询所有用户 users = User.query.all() ``` 以上代码中,首先创建一个名为“john”的用户,然后将其添加到数据库中并提交。接着,查询所有的用户。 这就是使用Flask-SQLAlchemy的基本步骤,可以根据自己的需要进行配置和使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值