目录
1.遇到的问题
1.sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: 'select 1'
解决方法:
文本sql的执行,需要使用sqlalchemy中的text()方法处理字符串,再执行语句
1、导入 from sqlalchemy import text
2、关键部分修改如下:
result = conn.execute(text("select 1"))
2.Could not parse SQLAlchemy URL from string 'mysql + pymysql://root:[email protected]:3306/database_learn?charset=utf8mb4'
#各字符串前面不能够加空格,不然可能报错
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
2.知识点
2.1 ORM模型
对象关系映射(ObjectRelationshipMapping),简称ORM,是一种可以用 Python 面向
对象的方式来操作关系型数据库的技术,具有可以映射到数据库表能力的 Python 类我们称
之为 ORM 模型。一个 ORM 模型与数据库中一个表相对应,ORM 模型中的每个类属性分
别对应表的每个字段,ORM模型的每个实例对象对应表中每条记录。ORM 技术提供了面向
对象与 SOL 交互的桥梁,让开发者用面向对象的方式操作数据库,使用 ORM 模型具有以
下优势。“
(1)开发效率高:几乎不需要写原生 SQL 语句,使用纯 Python 的方式操作数据库,大
大的提高了开发效率。
(2)安全性高:ORM 模型底层代码对一些常见的安全问题,比如 SOL 注入做了防护
比直接使用 SOL 语句更加安全。
(3)灵活性强:Flask-SOLAlchemy 底层支持 SOLite、MySQL、Oracle、PostgreSQL等
关系型数据库,但针对不同的数据库,ORM 模型代码几乎一模一样,只需修改少量代
码(数据库的配置),即可完成底层数据库的更换。
以下我们用 Flask-SQLAlchemy 来创建一个User 模型,示例代码如下:
2.1.1 ORM模型映射到增删改查
- add操作:
@app.route('/user/add')
def add_user():
user = User(username = "你好",password = "123456")
db.session.add(user)
db.session.commit()
return "数据添加成功"
- query操作:
查询一条数据用get
有警告的时候可以改为user = db.session.get(User,1)
查询多条数据用filter_by
users = db.session.fiter_by(username = "XXX")
@app.route('/user/query')
def query_user():
user = User.query.get(1)
print(f"{user.id}:{user.username}")
#同时查询多条操作
# users = User.query.filter_by(username = "你好")
# for user in users:
# print(f"{user.id}:{user.username}")
return "数据查找成功"
- update操作
先查询,再更新提交到数据库
@app.route('/user/update')
def update_user():
user = User.query.get(1)
user.username = "不好"
user.password = "1111"
db.session.commit()
return "数据修改成功"
- 删除操作
先查找,在更新提交到数据库
@app.route('/user/delete')
def delete_user():
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
return "数据删除成功!"
2.1.2 数据库外键
class Article(db.Model):
__tablename__ = "article"
id = db.Column(db.Integer, primary_key = True, autoincrement = True)
title = db.Column(db.String(200), nullable = False)
content = db.Column(db.Text, nullable = False)
#添加作者的外键id
authon_id = db.Column(db.Integer, db.ForeignKey("user.id"))
#创建一个关系
author = db.relationship("User",backref = "articles")
2.1.3 创建一个数据库表
app = Flask(__name__)
HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "123456"
DATABASE = "database_learn"
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
#各字符串前面不能够加空格
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key = True, autoincrement = True)
username = db.Column(db.String(100),nullable = False)
password = db.Column(db.String(100),nullable = False)
with app.app_context():#是 Flask-SQLAlchemy 扩展的一个函数,用于根据你定义的模型创建数据库表
db.create_all()#确保在创建数据库表时,Flask的应用程序上下文是激活的。这是必须的,因为 Flask-SQLAlchemy 在执行数据库操作时需要访问应用程序配置和其他资源。
2.1.4 通过外键关系查找
@app.route('/article/add')
def add_article():
article1 = Article(title = "Flask", content = "学习flask")
article1.author = User.query.get(2)
article2 = Article(title = "Python", content = "学习Python")
article2.author = User.query.get(2)
db.session.add_all([article1, article2])
db.session.commit()
return "文章添加成功!"
@app.route('/article/query')
def query_article():
user = User.query.get(2)
for article in user.articles:
print(f"{article.id}:{article.title}")
return "文章查询成功"
2.1.5 更新数据库结构
#ORM模型映射成表的三步
#1.flask db init:这步只需要执行一次;
#2.flask db migrate:识别ORM模型的改变,生成迁移脚本
#flask db upgrade:运行迁移脚本,同步到数据库中
migrate = Migrate(app,db)
#每次更新后执行第二三步就可以了
2.2 请求上下文和应用上下文
上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息
2.2.1 请求上下文
思考:在视图函数中,如何获取到当前请求的相关数据?比如:请求地址、请求方式、cookies等等信息
在flask中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session
- request:封装了HTTP请求的内容,针对的是http请求
- session:用来记录请求会话中的信息,针对的是用户信息
2.2.2 应用上下文
它的字面意思是 “应用上下文”, 但它不是一直存在的,它只是request context中的一个对app的代理人,所谓local proxy。
它的作用主要是帮助request获取当前的应用,它是伴request而生,随request而灭的。
应用上下文对象有:current_app、g
- current_app
应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name 打印当前app的名称,也可以在current_app中存储一些变量,例如:
1.应用的启动脚本是哪个文件,启动时指定了哪些参数
2.加载了哪些配置文件,导入了哪些配置
3.连了哪个数据库
4.有哪些public的工具类、常量
5.应用跑在哪个机器上,IP多少,内存多大
- g变量
g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别
2.2.3 两者的区别
- 请求上下文:保存了客户端和服务器交互的数据
- 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
3.开启Debug模式
在主函数中添加一行代码打开debug模式
if __name__ == '__main__':
app.run(debug=True)
app.run()
快速清屏终端快捷键:ctrl + L
标签:Flask,app,db,笔记,学习,ORM,user,上下文,数据库 From: https://blog.csdn.net/m0_55924178/article/details/142469643