首页 > 数据库 >Flask Mysq数据库连接

Flask Mysq数据库连接

时间:2023-02-16 11:47:12浏览次数:50  
标签:__ Flask Movie 数据库 db Mysq movie print app

# Flask 与 Mysql之间交互建议使用ORM(对象关系映射)

## 优点:1. 开发效率快,不必写原生

##            2. 灵活性高,不论是Mysql还是其他数据库连接,都可以用ORM来写几乎相同的代码

##            3. 安全性高 不必担心SQL注入问题

 

需要用到flask_sqlalchemy中的SQLAlchemy

from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 配置数据库
HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DATABASE = 'db_Watchlist'
CHARSET = 'utf8mb4'

app.config['SQLALCHEMY_DATABASE_URI'] = \
f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset={CHARSET}'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的监控
# 在扩展实例化前加载配置
db = SQLAlchemy(app) # 初始化拓展, 传入程序实例 app

# 定义模型 建立关系
class User(db.Model): # 表名将会是 user(自动将模型名全小写)或者用__tablename__来定义
# 定义表名
__tablename__ = 'tbl_user'
# 定义对象
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20))


class Movie(db.Model):
__tablename__ = 'tbl_movie'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(60), nullable=False, unique=True)
year = db.Column(db.String(4))


with app.app_context():
db.drop_all()
db.create_all()
user = User(name='Grey Li') # 创建一个 User 记录
m1 = Movie(title='Leon', year='1994') # 创建一个 Movie 记录
m2 = Movie(title='Mahjong', year='1996')
db.session.add(user) # 把新创建的记录添加到数据库会话中
db.session.add(m1)
db.session.add(m2)
db.session.commit() # 提交数据库会话,只需要在最后调用一次即可

@app.route('/')
@app.route('/index')
@app.route('/home')
def index(): # put application's code here
# return '<h1>Hello Totoro!</h1><img src="http://helloflask.com/totoro.gif">'
return render_template('index.html', name=name, movies=movies)


# 获取视图函数中里的变量值
# 用户输入的数据会包含恶意代码,所以不能直接作为响应返回,
# 需要使用 MarkupSafe(Flask 的依赖之一)提供的 escape() 函数对 name 变量进行转义处理,
# 比如把 < 转换成 &lt;。这样在返回响应时浏览器就不会把它们当做代码执行。
@app.route('/user/<username>')
def user_page(username):
return f'User:{escape(username)}'


@app.route('/test')
def test_url_for():
print(url_for('index'))
# 少加参数会报错
# print(url_for('user_page'))
print(url_for('user_page', name='greyli'))
print(url_for('user_page', name='peter'))
print(url_for('test_url_for'))
# 如果向url_for 添加多余的参数 会被认为查找字符串 附加到URL后面
print(url_for('test_url_for', num=2))
return 'This page!'


@app.route('/query/1')
def query():
movie = Movie.query.first()
print(movie)
print(movie.id)
print(movie.title)
print(movie.year)
print(Movie.query.all()) # 获取 Movie 模型的所有记录,返回包含多个模型类实例的列表
print(Movie.query.count()) # 获取 Movie 模型所有记录的数量
print(Movie.query.get(1)) # 获取主键值为 1 的记录
print(Movie.query.filter_by(title='Mahjong').first()) # 获取 title 字段为 Mahjong 的记录
print(Movie.query.filter(Movie.title == 'Mahjong').first()) # 同上 但使用不同的过滤方法 注意等号个数
return '查找成功'


@app.route('/update/1')
def update():
# 首先要获取到待更新的数据
movie = Movie.query.get(2) # 获取主键为 2 的记录
movie.title = 'WALL-E' # 直接对实例属性赋予新的值即可
movie.year = '2008'
db.session.commit() # 注意仍需要调用这一行来提交改动
return '更新成功!'


@app.route('/delete/1')
def delete():
# 仍然要获取待删除的数据
movie = Movie.query.get(1) # 如删除主键为 1 的记录
db.session.delete(movie) # 使用 db.session.delete() 方法删除记录,传入模型实例
db.session.commit() # 提交改动
return '删除成功'

if __name__ == '__main__':
app.run()

标签:__,Flask,Movie,数据库,db,Mysq,movie,print,app
From: https://www.cnblogs.com/TianyaPlayer/p/17126106.html

相关文章