Flask |
您所在的位置:网站首页 › flask如何连接数据库 › Flask |
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'] = FalseFlask_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 |