下面记录一下SQLAlchemy使用的技巧。python
当使用flask_Migrate迁移数据库的时候,当执行:mysql
python manage.py db migrate -m '修改说明'
db会默认去上下文中寻找定义的models模型,因此必须在初始化app的时候加载相关models的上下文;所以全部相关的model.py文件都应该在初始化app的时候:sql
from XXX import model
from extensions import db class User(db.model) __tablename__ = 'users' user_id = db.Column(db.String(8), primary_key=True) # 改成 class User(db.model) __tablename__ = 'users' user_id = db.Column(db.String(20), primary_key=True)
问题:直接迁移会出现no change,由于不会检测字段的类型。数据库
办法:修改字段的名字迁移后再将字段改回迁移,至关于删除原来的字段从新建立;flask
办法:session
# 删除原来的migrations文件夹; # 去数据库删除alembic_version表的内容; # 从新执行数据库迁移操做;
在有些时候,咱们没有初始化APP,可是又想使用models中定义的模型和数据库的ORM操做,那么就须要手动初始化了。app
from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from models import AdminUser # 建立一个配置对象 engine = create_engine('mysql+pymysql://username:passwd@ip:port/db?charset=utf8', convert_unicode=True) # 建立一个会话 db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) # 初始化查询对象 AdminUser.query = db_session.query_property() # 下面就跟在框架中同样了 admin = AdminUser() admin.id = 1 admin.username = username admin.password = pwd db_session.add(admin) db_session.commit()
缘由是:链接断开后,事务没有回滚,残留的锁致使后续的查询报错.sqlalchemy对每个查询和插入等操做都是一个事务。框架
解决:在全部的数据库操做的时候捕捉异常进行事务的回滚。code
# main.py from models import OrderInfo from sqlalchemy.exc import InvalidRequestError try: order = OrderInfo.query.filter_by(task_id=user_dict.get('task_id')).first() order.status = 'COMPLETE' db.session.commit() except InvalidRequestError: db.session.rollback() except Exception as e: print(e)