sqlalchemy入门

merge 和update区别

使用merge方法,如果数据库中有该记录,则更新该记录,如果不存在该记录,则进行insert操作。

使用update的话,会无条件执行update。

也就是说如果数据库中有该记录的话,merge和update是一样的。
但是如果数据库中没有该记录,使用merge执行insert,不会报错,而使用update会报错

原生Session和scoped_session的原生session:

由于无法提供线程共享功能,所以在开发时要注意,要给每个线程都创建自己的session
打印sesion可知他是sqlalchemy.orm.session.Session的对象

scoped_session

优点:支持线程安全,为每个线程都创建一个session:
两种方式:通过本地线程Threading.Local()和创建唯一标识的方法(参考flask请求源码)

获取对象字典

res = db_session.query(User).filter(User.id == user_id).first()
if res:
     res = res.__dict__
     res.pop('_sa_instance_state')
return res

 优雅的批量添加

try:
    user_list = []
    table_labels = [item for item in User.__dict__.keys() if not item.startswith('_')]  # 获取表字段name列表
    table_labels.remove('id')
    for item in form_list:
        user = User()
        for key in table_labels:
            setattr(user, key, item.get(key, None))
        user_list.append(user)
    db_session.add_all(user_list)
    db_session.commit()
except Exception as e:
    g.pg_db.rollback()
    raise e

优雅的批量更新或新增

try:
    # 更新
    add_instance = []
    table_labels = set([item for item in User.__dict__.keys() if not item.startswith('_')])
    for item in form_list:
        item = {key: item.get(key) for key in item.keys() if key in table_labels}
        if item.get('id'): # 存在ID则更新
            filter_params = [User.id == item.pop('id')]
            db_session.query(User).filter(*filter_params).update(item)
        else: # 不存在ID则新增
            add_instance.append(User(**item))

    # 添加
    db_session.add_all(add_instance)
    db_session.commit()
except Exception as e:
    g.pg_db.rollback()
    raise e

 查询结果row转dict

row = db_session.query(User).filter().first()

方法一:

row._asdict()

方法二:

{key: getattr(row, key) for key in row.keys()}

方法三:

OrderedDict({k: getattr(row, k) for k in row._real_fields})

方法四:

select_filter = [User.id,User.name,Address.name.label('Address_name')]
fields = [field.key if hasattr(field, "key") else getattr(field, '_label') for field in select_filter]
OrderedDict({k: getattr(row, k) for k in fields})

推荐阅读

SQLAlchemy:https://www.jianshu.com/p/65903a69d61d

posted @ 2020-06-01 17:10  逐梦客!  阅读(549)  评论(0)    收藏  举报