摘要:后端一个重要的点就是与数据库联系,例如网页的注册登录,内容的更新等都需要与数据库建立关系。就是一个这样的,我们可以直接安装来使用。最后用来实现创建。
后端一个重要的点就是与数据库联系,例如网页的注册、登录,内容的更新等都需要与数据库建立关系。以MySQL数据库为例,平时我们会用mysqldb(python 2)或者pymysql(python 3)去操作MySQL数据库,但这种方法也是需要自己编写SQL语句的。现在我们有了ORM模型,简单来说,ORM是把数据库中的表抽象成模型,表的列名对应模型的属性,这样我们可以调用类的属性或方法去获得数据库中的数据。例如假设MySQL数据库中有一张表名为table1,使用SELECT * FROM table1 WHERE id=1获取id为1的数据,如果将表table1映射成ORM模型Table,那么可以直接使用Table.query.filter(id=1),这样操作简单了很多,也很利于理解。
SQLAlchemy就是一个这样的ORM,我们可以直接安装flask_sqlalchemy来使用。在这之前我们先在MySQL中手动建立一个数据库harp,在建立的时候把charset设置为utf8,避免存入中文时变成乱码,然后在配置文件config.py中填写好数据库的连接信息:
HOST = "127.0.0.1" PORT = "3306" DB = "harp" USER = "root" PASS = "Your Password" CHARSET = "utf8" DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset={}".format(USER, PASS, HOST, PORT, DB, CHARSET) SQLALCHEMY_DATABASE_URI = DB_URI
SQLAlchemy依赖mysqldb或者pymysql去连接数据库和执行SQL语句,因为我们用的是python 3,所以需要在配置信息中指明使用pymysql,如果是python 2可以省略,默认是使用mysqldb。
建立好了数据库,我们开始建表,首先建立一张用户表,我们设想它应该有id(作为主键)、用户名、密码、注册时间这些基本的字段,有了ORM,我们就不用再写SQL去建表了,在项目的主py文件中添加以下代码:
from flask_sqlalchemy import SQLAlchemy from datetime import datetime import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class Users(db.Model): __tablename__ = "users_info" id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(32), nullable=False) password = db.Column(db.String(100), nullable=False) register_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) db.create_all()
解读一下这段代码,导入SQLAlchemy和含有数据库连接信息的config,实例化一个SQLAlchemy对象名为db,其传入的参数为Flask实例app。接下来定义了一个User类,这个类就是ORM中的模型,也就是数据库中的表映射的模型,它需要继承自db.Model,__tablename__这个属性就是建表后,数据库生成的表名;然后使用db.Column来实例化id/username/password/register_time这几个列,db.Column的参数描述列的类型、主键等信息,如db.Integer/db.String(32)/db.DateTime分别代表整形、字符串(最大长度)、时间,primary_key=True说明该字段为主键,autoincrement=True代表自增长,nullable决定是否可为空,default代表默认值。最后用db.create_all()来实现创建。我们暂时不用理解为何SQLAlchemy需要传入Flask实例作为参数,为何模型要继承自db.Model,重要的是可以先把想要的表建立起来。
进入数据库,输入desc user_info;,我们发现表已经建立好了,其结构图如下:
但它现在还是空的,我们来试着插入一条语句,将视图函数修改为:
@app.route("/") def index(): user = Users(username="Harp", password="123456") db.session.add(user) db.session.commit() return render_template("home.html")
代码实例化一个Users的对象user,传入username和password,使用db.session.add(user)将其加入到数据库的session(可以理解为事务)中,然后使用db.session.commit()提交。我们运行程序,然后用浏览器访问,浏览器正常显示了结果,这时再看一眼数据库,发现这条数据已经写入到了数据库:
查询、修改数据也同样很简单:
@app.route("/") def index(): user = Users.query.filter(Users.id == 1).first() #查找 print(user.username) user.username = "Harp1207" #修改 db.session.commit() #修改后需提交 print(user.username) return render_template("home.html")
思考问题:
1.为何要把模型的操作语句放在视图函数中?(搜索上下文这个概念)
2.数据查找,我们用的是Model.query,其实还可以用db.session.query,两者有何区别?filter和filter_by又有何区别?
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41231.html
摘要:本节围绕在中如何定义关系及如何使用关系进行查询进行讲解,使读者能够快速掌握的关系操作。班级与学生为一对多关系,班级与老师之间为多对多关系。三年二班多对多关系的使用通过关联模型实现,在其中分别设置模型和的外键,并且在父模型中设置相应的实现。 上一篇文章:Python-SQLAlchemy:第2节:查询条件设置下一篇文章:Python-SQLAlchemy:第4节:级联 关系数据库是建立...
摘要:在实际项目中,这么做肯定是不行的实际项目中不会使用内存数据库,这种数据库一般只是在单元测试中使用。接下来,我们将会了解中单元测试的相关知识。 在上一篇文章,我们介绍了SQLAlchemy的基本概念,也介绍了基本的使用流程。本文我们结合webdemo这个项目来介绍如何在项目中使用SQLAlchemy。另外,我们还会介绍数据库版本管理的概念和实践,这也是OpenStack每个项目都需要做的...
摘要:承接上文,我们的,除了用户表,还需要存储所有问题内容的表和存储所有评论的表,并且都和通过外键来关联。我们不排除后续需要更多表的可能性,把所有模型和视图函数写在一起看着也太混乱了为此,我们新建一个,把三个模型都放在这里。 承接上文,我们的Q&A demo,除了用户表,还需要存储所有问题内容的表questions_info和存储所有评论的表comments_info,并且都和users_i...
摘要:下一篇文章第节查询条件设置是编程语言下的一款开源软件。提供了工具包及对象关系映射工具,使用许可证发行。在关闭连接时会自动进行事务提交操作。引入多条件查询时使用。由于上下文函数退出时会自动提交事务,所以无需显示的调用使新增生效。 下一篇文章:Python-SQLAlchemy:第2节:查询条件设置 SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系...
摘要:当使用到后者这类微型框架时,根据业务场景不同,如果需要处理模型的建立升级和迁移的问题,可以考虑下接下来要介绍的和。这时候检查数据库,可以发现生成了张表,升级工作就完成了。而我在使用的实际项目中是操作的原生,异步类型的配合使用留待以后探究。 背景 Python的世界里有许多web框架:比如大而全的 Django, 提供了模型定义迁移,到路由处理,再到视图的渲染等整套功能;比如小巧灵活的F...
阅读 1437·2023-04-25 16:31
阅读 2039·2021-11-24 10:33
阅读 2743·2021-09-23 11:33
阅读 2527·2021-09-23 11:31
阅读 2900·2021-09-08 09:45
阅读 2335·2021-09-06 15:02
阅读 2646·2019-08-30 14:21
阅读 2312·2019-08-30 12:56