自主学习 之 python-sqlAlchemy数据库
设置唯一约束
设置单一约束
设置联合唯一约束
方法一:多个字段定义唯一
fileName=db.Column(db.Text(),unique=True)
className=db.Column(db.Text(),unique=True)
funName=db.Column(db.Text(),unique=True)
方法二:UniqueConstraint
UniqueConstraint('fileName', 'className','funName',name='unique_testPlan')
查询
模块 | 语法 | ><(大于和小于)查询 | and_和or_查询 |
---|---|---|---|
filter_by() | 直接用属性名,比较用= | 不支持 | 不支持 |
filter() | 用类名.属性名,比较用== | 支持 | 支持 |
方法 | 说明 | 举例 |
---|---|---|
= | filter_by全匹配 | User.query.filter_by(name=‘A’) |
and_ | 并 | User.query.filter(and_(User.className==‘classname1’,User.funName==‘funname1’)) |
or_ | 或 | User.query.filter(or_(User.className==‘classname1’,funName==‘funname1’)) |
in_ | 查询属于某些值的数据 | User.query.filter(User.name.in_(‘classname1’,’‘classname2’,‘classname4’)) |
notin_ | 查询不属于某些值的数据 | User.query.filter(User.name.notin_(‘classname1’,’‘classname2’,‘classname4’)) |
match_ | 匹配 | User.query.filter(User.name.match(‘classname1’)) |
like | 模糊查询 | User.query.filter(User.name.like(’%classname%’)) |
数据库迁移
使用Flask-Migrate实现
第一步设置应用实例
进入应用工作目录,并设置应用实例
set FLASK_APP=flasky.py
D:\flask>set FLASK_APP=flasky.py
第二步创建迁移仓库
创建迁移仓库 flask db init
D:\flask>flask db init
Creating directory D:\flask\migrations ... done
Creating directory D:\flask\migrations\versions ... done
Generating D:\flask\migrations\alembic.ini ... done
Generating D:\flask\migrations\env.py ... done
Generating D:\flask\migrations\README ... done
Generating D:\flask\migrations\script.py.mako ... done
Please edit configuration/connection/logging settings in 'D:\\flask\\migrations\\alembic.ini' before proceeding.
第三步创建迁移脚本
创建迁移脚本
flask db migrate -m "initial migration"
D:\flask>flask db migrate -m "initial migration"
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added column 'users.about_me'
INFO [alembic.autogenerate.compare] Detected added column 'users.last_seen'
INFO [alembic.autogenerate.compare] Detected added column 'users.member_since'
INFO [alembic.autogenerate.compare] Detected added column 'users.name'
Generating D:\flask\migrations\versions\18a6d3efca46_initial_migration.py ... done
此时可应用中可看到如下文件:
第四步更新数据库
更新数据库
D:\flask>flask db upgrade
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 18a6d3efca46, initial migration
手动删除migrations后不生成迁移脚本的处理
问题:手动删除了migrations目录后,修改model,再迁移时,不会报错,却不生成迁移脚本。
原因:数据库中有自动生成的一张表alembic_version,此表中记录了版本信息。
处理:清空表alembic_version中的数据,然后再执行迁移即可。(sqlite删除表数据的详细步骤见下方)
sqllite安装
没有原由,选择了它。在命令窗口操作还是蛮方便的。
见如下链接:sqlite中文网-安装
打开已存在的sqlite文件
>sqlite3
>.open 'D:\flask\data-dev.sqlite'
查询表
>select * from alembic_version;
955ed4d0e230
清空表数据
> delete from alembic_version;