分类 "Database" 下的文章

问题:使用sqlalchemy如何更新json类型字段的数据
解决:获取json数据时虽然类型是dict,但仍需要进行dict()转换,否则无法更新
方法:

user = self.db.query(User).filter(
User.id == user_data['id']).first()
if not user:
info = {'country': user_data['country'],
'city': user_data['city']}
user = User(
nickname=user_data['nickname'],
info=info)
self.db.add(user)
else:
user.nickname=user_data['nickname']
info=dict(user.info)      # 注意这一步,不进行dict转换,就更新不成功
info['country']=user_data['country']
info['city']=user_data['city']
user.info=info
self.db.commit()

问题:使用sqlalchemy如何实现mysql的sum方法
解决:使用func
方法:
self.db.query(func.sum(SKS.used_time).label('total_time')).filter(SKS.uid == cuid).all()
查询当前学生总共使用时长

问题:a表的两个字段都对应b表的id,如何查询?
解决:将b表当两次用
方法:
select a.id, b.username as answer, c.username as owner  from forum_like as a, users as b, users as c  where a.answer_id=b.id and a.owner_id=c.id;

问题:如果更改数据表字段名称
解决:使用alter命令
方法:
将users表中name字段修改为username
alter table users change name username varchar(64);

问题:sqlalchemy/mysql查询数据比较慢,如何解决
解决:查询数据时避免查询全部,如果数据表字段很多,查询会非常慢
方法:
usersql = select * from users where age > 12;
优化,只查询需要的字段
usersql = select name, age from users where age > 12;
sqlalchemy
user = self.db.query(User).filter(User.age > 12).all()
优化
user = self.db.query(User.name, User.age).filter(User.age > 12).all()

获得数据的条数:
count = self.db.query(User).filter(User.age==12).count()
查询速度更快的方法
count = self.db.query(func.count('1')).select_from(User).filter(User.age==12).scalar()

注: 如果数据表字段很少,效果不明显,如果有十几个字段,这样写速度反应会很明显变快了。