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

浙公网安备 33010602011771号