一、数据库框架 Flask-SQLAlchemy
(1)安装: pip install flask-sqlalchemy
(2)Flask-SQLAlchemy数据库URL
数据库引擎
URL
MySQL
mysql://username:password@hostname/database
Postgres
postgresql://username:password@hostname/database
SQLite(Unix)
sqlite:abslute/path/to/database
SQLite(Windows)
sqlite:///c:/absolute/path/tp/database
二、配置数据库
from flask.ext.sqlalchemy importSQLAlchemy
basedir= os.path.abspath(os.path.dirname(__file__)
app= Flask(__name__)
app.config['SQLACHEMY_DATABASE_URI'] = \'sqlite:///' + os.path.join(basedir,'data.sqlite')
app.config['SQLACHEMY_COMMIT_ON_TEARDOWN'] =True
db= SQLAlchemy(app)
三、定义模型
**roles表和user表定义模型Role和User
classRole(db.Model):#数据库中使用的表名
__tablenaame__ = 'roles'id= db.Column(db.Integer, primary_key =True)
name= db.column(db.String(64),unique =True)def __repr__(self):return '% self.name
classUser(db.Model):__tablenaame__ = 'users'id= db.Column(db.Integer, primary_key =True)
username= db.column(db.String(64),unique = True,index =True)def __repr__(self):return '% self.username
(2)最常使用的SQLAlchemy列选项
选项名
说明
primary_key
主键,经常是ID
unique
不允许出现重复的值
index
创建索引,提升查询效率
nullable
允许空值
default
定义默认值
四、关系
(1)一对多关系
classRole(db.Model):#数据库中使用的表名
'''__tablenaame__ = 'roles'
id = db.Column(db.Integer, primary_key =True)
name = db.column(db.String(64),unique = True)'''users= db.relationship('User',backref ='role')'''def __repr__(self):
return ' % self.name'''
classUser(db.Model):'''__tablenaame__ = 'users'
id = db.Column(db.Integer, primary_key =True)
username = db.column(db.String(64),unique = True,index = True)'''role_id= db.Column(db.Integer,db.ForeignKey('role.id'))'''def __repr__(self):
return ' % self.username'''
(2)常用的关系项
选项
说明
backref
在关系的另一个模型中添加反向引用
primaryjoin
明确两个模型中间的连接条件
lazy
指定加载相关记录
uselist
设置Fales,不使用列表
order_by
指定关系中记录的排序方式
secondary
指定多对多关系表的名字
secondaryjoin
无法自行决定时,指定多堆垛关系的耳机连接条件
**lazy可选值select(首次访问时需要加载),immediate(源对象加载后就加载),joined(加载记录,单使用连接),subquery(立即加载,单使用子查询),noload(永不加载)和dynamic(不加载记录,单提供加载记录查询)
**db.relationship(),把uselist设置为False,把“多”变成“一”
五、数据库操作
(1)创建表
from hello importdb
db.create_all()
**创建一个名字为data.sqlite
(2)插入行
db.session.all_all([admin_role,mod_role,user_role,user_john,user_susan,user_david])#提交数据
db.session.commit()
**数据回滚 db.session.rollback()
(3)修改行
#把"Admin" 角色重命名为"Administrator"
admin_role.name = 'Administrator'db.session.add(admin_role)
db.session.commit()
(4)删除行
db.session.delete(mod_role)
db.session.commit()
(5)查询行
5.2常用的查询过滤器
过滤器
说明
filter
把过滤器添加到原查询上,返回一个新查询
filter_by
把等值过滤器添加到原查询上,返回一个新查询
limit
使用指定的值限制原查询返回的结果数量,返回一个查询
offset
偏移原查询返回的结果,返回一个新查询
order_by
根据指定条件对原查询结果进行排序,返回一个新查询
group_by
根据指定条件对原查询结果进行分组,返回一个新查询
5.3常用查询执行函数
方法
说明
all
以列表形式返回查询的所有结果
first
返回查询的第一个结果,没有结果返回None
first_or_404
返回查询的第一个结果,没有结果,返回404错误
get
返回指定主键对应的行,没有结果返回None
get_or_404
返回指定主键对应的行,没有结果,返回404错误
count
返回查询的结果的数量
paginate
返回Paginate对象,它包含指定范围内容的结果
六、在视图函数中操作数据库
七、集成Python shell ?
为shell命令添加一个上下文
defmake_shell_context():return dict(app=app,db=db,User=User,Role=Role)
manager.add_command("shell",Shell(make_context=make_shell_context)
**make_shell_context函数注册了程序,数据库实例以及模型,因此这些对象能直接导入shell
八、数据库迁移(Flask-Migrate)
(1)安装 : pip install flask-migrate
(2)配置Flask-Migrate
form flask.ext.migrate importMigrate,MigrateCommand#...
migrate =Migrate(app,db)
manager.add_command('db',MigrateCommand)
(2)迁移脚本
upgrade()函数把迁移中的改动应用到数据库中
downgrade()函数责将改动删除
自动迁移脚本: python hello.py db migrate -m "initial migration"
九、更新数据库
python hello.py db upgrade