Flask

您所在的位置:网站首页 flask如何连接数据库 Flask

Flask

2023-07-24 23:47| 来源: 网络整理| 查看: 265

1.Flask_SQLAlchemy创建数据库

Flask_SQLAlchemy整合了Flask和SQLAlchemy的功能,让我们能够使用更少的代码实现在网站中调用数据库的功能。

首先使用命令在终端窗口安装Flask_SQLAlchemy,

pip install flask_sqlalchemy

接下来我们在app实例文件中,为app绑定数据库。

首先实例化app,

from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 实例化app对象

接下来,输入数据库格式化字符串,如,

HOSTNAME = '127.0.0.1' PORT = '3306' USERNAME = 'root' PASSWORD = '******' DATABASE = 'test' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

为app对象的配置文件添加SQLALCHEMY_DATABASE_URI和SQLALCHEMY_TRACK_MODIFICATIONS参数,其中SQLALCHEMY_DATABASE_URI的参数为数据库格式化字符串DB_URI;SQLALCHEMY_TRACK_MODIFICATIONS默认开启,开启此选项会占用大量内存,所以我们关闭它,

app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Flask_SQLAlchemy将SQLAlchemy的功能进行了整合,我们之前介绍的SQLAlchemy方法都可以通过数据库变量来引用,不需要再一一导入,只需实例化数据库对象,

db = SQLAlchemy(app) # 之后所有的SQLAlchemy都可以通过“db.方法名”来调用,如,db.Column,db.String等

我们下面来构建两个ORM模型,分别为Student表和StudentExtend表。Student表中有id字段(数值型,主键,自增)、name字段(字符型,非空)、age字段(数值型)、sex字段(枚举型,值为“男”或“女”);StudentExtend表有num字段(数值型,主键,自增)、name字段(字符型,非空)、id字段(数值型,外键对应Student表的id字段)、rank字段(数值型)、hobby字段(字符串类型),两张表为一对多的关系。代码如下,

class Student(db.Model): # 继承于db.Model类 __tablename__ = 'student' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(10), nullable=False) age = db.Column(db.Integer) sex = db.Column(db.Enum("男", "女")) def __repr__(self): return 'Student(name:{}, age:{}, sex:{})'.format(self.name, self.age, self.sex) class StudentExtend(db.Model): __tablename__ = 'student_extend' num = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(10), nullable=False) id = db.Column(db.Integer, db.ForeignKey('student.id')) rank = db.Column(db.Integer) hobby = db.Column(db.String(50)) student = db.relationship("Student", backref="extends") def __repr__(self): return 'StudentExtend(name:{}, rank:{}, hobby:{})'.format(self.name, self.rank, self.hobby) db.drop_all() # 删除所有ORM模型 db.create_all() # 创建所有ORM模型

最后添加视图函数,

@app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True)

这样,我们启动后数据库会被自动创建。

我们为了简化代码,可以新建一个config.py文件,将app实例文件中的数据库格式化字符串剪切到config.py文件中,并进行修改,

HOSTNAME = '127.0.0.1' PORT = '3306' USERNAME = 'root' PASSWORD = '******' DATABASE = 'test' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) SQLALCHEMY_DATABASE_URI = DB_URI SQLALCHEMY_TRACK_MODIFICATIONS = False

同时,在app实例文件中导入config.py,在实例化app对象后添加以下代码,

import config app.config.from_object(config) 2.数据操作

Flask_SQLAlchemy中对数据的操作与SQLAlchemy中基本相同。

我们来添加几个数据,

student1 = Student(name='zhao', age=23, sex="女") student2 = Student(name='qian', age=20, sex="男") extend1 = StudentExtend(name='zhao', rank=1, hobby="conding") extend2 = StudentExtend(name='qian', rank=4, hobby="math") extend1.student = student1 extend2.student = student2 db.session.add_a。ll([extend1, extend2]) db.session.commit()

我们来查询age为23的学生对应的extend,

student1 = db.session.query(Student).filter(Student.age == 23).first() print(student1.extends)

执行后,会返回student1.extends的结果如下,

[StudentExtend(name:zhao, rank:1, hobby:conding)]

我们将其年龄修改为27,并返回,

student1.age = 27 db.session.commit() print(student1)

返回,

Student(name:zhao, age:27, sex:女)

我们删除该数据,

db.session.delete(student1) db.session.commit() 3.命令行执行函数方法 3.1.添加命令行方法

我们可以使用Flask_Script来实现终端命令行执行特定函数。

首先,我们来新建一个manage.py文件,代码如下,

from flask_script import Manager manager = Manager(app) if __name__ == '__main__': manager.run()

这是一个入口文件的标准形式,我们接下来为入口添加命令行方法greet,该方法固定返回“hello world”,

@manager.command # 为manager添加新命令行命令 def greet(): return "hello world"

这样,我们可以在终端窗口输入以下代码,

python manage.py greet

终端会返回,

hello world

我们同样可以,将方法写入其他文件再导入到入口文件中,实现同样的效果。例如,我们新建一个db_script.py文件来写入相关方法,

from flask_script import Manager db_manager = Manager() @db_manager.command def init(): return "初始化迁移脚本" @db_manager.command def revision(): return "生成迁移脚本" @db_manager.command def upgrade(): return "脚本映射到数据库成功"

在入口文件中添加以下代码,

from db_script import db_manager manager.add_command("db", db_manager) # 为manager添加db_manager的方法 # 第一个参数为方法前缀,所有的db_manager方法都要通过“前缀名 方法名”的形式在终端中运行

我们在终端中输入,

python manage.py db init

返回,

初始化迁移脚本 3.2.添加需要传参数的命令行方法

如果,我们添加的命令行方法需要我们传参,需要在方法前添加@manager.option(“参数前缀名”, “参数名”, dest=“对应参数”)实现传参,例如,我们添加一个add_student()方法来向数据库中的Student表添加数据,

from app import app, db, Student # 从app实例文件中导入相关对象 @manager.option("-n", "--name", dest="name") # 指定-n为传递add_student的name参数 @manager.option("-a", "--age", dest="age") # 指定-a为传递add_student的age参数 @manager.option("-s", "--s", dest="sex") # 指定-s为传递add_student的sex参数 def add_student(name, age, sex): student = Student(name=name, age=age, sex=sex) db.session.add(student) db.session.commit()

我们来添加一条数据,

manage.py add_student -n sun -a 25 -s 女

这样数据库中就多了一条相应数据。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3