Python SQLAlchemy
一、连接及创建类
from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.ext.automap import automap_base # 连接数据库: engine = create_engine('mysql+pymysql://root:password@localhost:3306/myDb') # 创建与表名匹配的映射类: Base = automap_base() Base.prepare(engine, reflect=True) Metadata = Base.classes.FN_Metadata Resource = Base.classes.FN_Resource Task = Base.classes.FN_Task Config = Base.classes.SYS_Config User = Base.classes.SYS_User db_session = Session(engine)
二、新增
#新增 #方式一 session.add(User(user_id=1, user_name='test')) session.add(Config(config_id=1, config_name='test')) session.commit() session.close() #方式二 session.add_all([ User(user_id=1, user_name='test'), Config(config_id=1, config_name='test') ]) session.commit() session.close()
获取新增项的id:
user = User(name='test') session.add(user) session.commit() print(user.id)
三、查询
#结果的类型 instance instance of list keyed tuple of list value of list #基本查询 session.query(User).filter_by(username='abc').all() session.query(User).filter(User.username=='abc').all() session.query(Blog).filter(Blog.create >= 0).all() session.query(Blog).filter(Blog.create >= 0).first() session.query(Blog).filter(Blog.create >= 0 | Blog.title == 'A').first() session.query(Blog).filter(Blog.create >= 0 & Blog.title == 'A').first() session.query(Blog).filter(Blog.create >= 0).offset(1).limit(1).scalar() session.query(User).filter(User.username == 'abc').scalar() session.query(User.id).filter(User.username == 'abc').scalar() session.query(Blog.id).filter(Blog.create >= 0).all() session.query(Blog.id).filter(Blog.create >= 0).all()[0].id dict(session.query(Blog.id, Blog.title).filter(Blog.create >= 0).all()) session.query(Blog.id, Blog.title).filter(Blog.create >= 0).first().title session.query(User.id).order_by('id desc').all() session.query(User.id).order_by('id').first() session.query(User.id).order_by(User.id).first() session.query(User.id).order_by(-User.id).first() session.query('id', 'username').select_from(User).all() session.query(User).get('16e19a64d5874c308421e1a835b01c69') #多表查询 session.query(Blog, User).filter(Blog.user == User.id).first().User.username session.query(Blog, User.id, User.username).filter(Blog.user == User.id).first().id session.query(Blog.id, User.id, User.username).filter(Blog.user == User.id).first().keys() #条件查询 from sqlalchemy import or_, not_ session.query(User).filter(or_(User.id == '', User.id == '16e19a64d5874c308421e1a835b01c69')).all() session.query(User).filter(not_(User.id == '16e19a64d5874c308421e1a835b01c69')).all() session.query(User).filter(User.id.in_(['16e19a64d5874c308421e1a835b01c69'])).all() session.query(User).filter(User.id.like('16e19a%')).all() session.query(User).filter(User.id.startswith('16e19a')).all() dir(User.id) #函数 from sqlalchemy import func session.query(func.count('1')).select_from(User).scalar() session.query(func.count('1'), func.max(User.username)).select_from(User).first() session.query(func.count('1')).select_from(User).scalar() session.query(func.md5(User.username)).select_from(User).all() session.query(func.current_timestamp()).scalar() session.query(User).count()
四、删除
#删除 #方式一 session.query(User).filter(User.user_id == 1).first().delete() session.commit() session.close() #方式二 user = session.query(User).filter(User.user_id == 1).first() session.delete(user) session.commit() session.close()
五、修改
#修改 #方式一 session.query(User).filter(User.user_name == 'abc').update({'name': 'test'}) session.commit() session.close() #方式二 user = session.query(User).filter_by(user_name='abc').scalar() user.name = 'test' session.commit() session.close()
六、异常
try: pass except Exception as e: logging.error('[x] %s' % e) print('[x] %s' % e) #必填项为空 sqlalchemy.exc.IntegrityError #字段类型错误 sqlalchemy.exc.InternalError
七、常见问题
1. SQLAlchemy不是线程安全的,使用多线程、多进程时,需要使用特殊方法保证安全:
(1)每个进程都创建一个新的Session对象
db_session = Session()
(2)使用pymysql库
引用说明:
http://www.codexiu.cn/python/SQLAlchemy%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/73/529/
转载请注明出处。

浙公网安备 33010602011771号