分类 "Database" 下的文章

问题: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()

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

问题:使用sqlalchemy增加数据后无法获取到id
解决:sqlalchemy默认add完成后是可以获取到相应的id的,如何获取不到可能因为代码错误
方法:
下面是我的错误情况
sqs = SQS(status = 1, used_time = utime, user_id = cuid)
self.db.add(sqs)
self.db.commit()
sqss = self.db.query(SQS).filter(SQS.user_id == cuid).all()
right_count = len([sqs.id for sqs in sqss if sqs.status == 1])   这里的sqs会覆盖之前的sqs变量
print(''40)
print(sqs.id)   # 此时的sqs已经不是对象了

所以要么在for循环中使用其它变量,或者在之前将sqs的id进行保存

问题:如何让group by的数据按一定的顺序进行合并,而不是取id最小的数据
解决:group by 比order by先执行,order by不会对group by 内部进行排序
方法:
select uid, class_id, max(score) from scores where school=2 group by class_id order by score;
这样就可以取出学校id为2的所有班级中最高的分数了
注意:此处的uid必不是分数最高的学生id,而是score表中id最小的uid

注:http://blog.csdn.net/agileclipse/article/details/12775381

问题:希望查询type字段为大写的"C",但mysql默认查询是不区分大小写的
解决:使用binary
方法:
select * from questions where binary type="C";

问题:sqlalchemy删除语句如何写,添加语句如何写
方法:
一、add添加语句
user = User(User.name='haha', User.age=12)
self.db.add(user)
self.db.commit()

二、delete删除语句
uid = 23
user = self.db.query(User).get(uid)
self.db.delete(user)
self.db.commit()

user = self.db.query(User).filter(User.id == uid).delete()
self.db.commit()