flask连接数据库(flask_sqlalchemy)
1.导入扩展类
Flask 有大量的第三方扩展,这些扩展可以简化和第三方库的集成工作。 Flask-SQLAlchemy 可以方便操作数据库。
from flask_sqlalchemy import SQLAlchemy # 导入扩展类
app = Flask(__name__)
2.设置数据库URI
连接信息拼接方式(scott为用户名,tiger为密码)
Postgres:
//scott:tiger@localhost/mydatabase
MySQL:
//scott:tiger@localhost/mydatabase
Oracle:
//scott:tiger@127.0.0.1:1521/sidname
# '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
# 即前面加上连接数据库+对应的包!!!
# pymysql,flask连接mysql
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://<username>:<password>@<host>/<dbname>'
# cx_Oracle,flask连接oracle
app.config['SQLALCHEMY_DATABASE_URI'] = 'oracle+cx_oracle://user:pass@host:port/servicename'
# 注意oracle最后为服务名,以连接本地oracle数据库为例
app.config['SQLALCHEMY_DATABASE_URI'] = 'oracle+cx_oracle://testdb:123456@localhost:1521/ORCL'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 对模型修改监控的设置
app.config['SQLALCHEMY_ECHO'] = True #查询时会显示原始SQL语句
db = SQLAlchemy(app) # 初始化扩展,传入程序实例 app
3.创建数据库模型(db_try.py)
class User(db.Model): # 表名将会是 user(自动生成,小写处理)
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(20)) # 名字
class Movie(db.Model): # 表名将会是 movie
id = db.Column(db.Integer, primary_key=True) # 主键
title = db.Column(db.String(60)) # 电影标题
year = db.Column(db.String(4)) # 电影年份
4.建表
from db_try import db
# 建表
db.create_all()
(可以看到创建以后的表)
5.插入数据
# 插入数据
# user = User(id=1,name='Kimheel')
user1 = User(id=2,name='victoria')
user2 = User(id=3,name='heechul')
# m1 = Movie(id=1,title='Leon',year='1994')
# m2 = Movie(id=2,title='Lost Generation',year='2013')
m3 = Movie(id=3,title='Forrest Gump',year='1994')
m4 = Movie(id=4,title='exm',year='2014')
db.session.add(user1)
db.session.add(user2)
db.session.add(m3)
db.session.add(m4)
db.session.commit()
注意,如果建表没有设置自增,这里要自己输入id主键,且不能违反唯一性原则
(插入后数据如图所示)
6.查询
from sqlalchemy import and_
from db_try import User,Movie
movie = Movie.query.first()
print(movie.title) # 查询第一条记录的结果
print(movie.year)
cc = Movie.query.all()
print(cc[1].title) # 返回第一条记录的标题
print(Movie.query.count()) # 返回记录总条数
print(Movie.query.get(1).title) # 返回主键值为1的记录
# 添加筛选进行查询(两种方式查询)
print(Movie.query.filter_by(title='Leon').first())
print(Movie.query.filter(Movie.id>2).all())
print(Movie.query.filter(and_(Movie.id>2,Movie.title.endswith('Gump'))).count()) # 需要导入_and
对应的输出结果
7.删除
movie = Movie.query.get(1)
db.session.delete(movie) # 使用 db.session.delete() 方法删除记录,传入模型实例
db.session.commit() # 提交改动
8.更新
movie = Movie.query.get(2)
movie.title = 'WALL-E' # 直接对实例属性赋予新的值即可
movie.year = '2008'
db.session.commit() # 注意仍然需要调用这一行来提交改动