sqlalchemy异常

| 标签 python  sqlalchemy  浏览次数: -

group_by

OperationalError

  • 错误详情
OperationalError: (_mysql_exceptions.OperationalError) (1055, "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'qdata_cloud.drill_base.create_time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by") [SQL: xxx]
  • 原因:

sql_mode使用的是默认值,而之前使用的mysql配置文件中sql_mode=”“,由于这个特性使在使用group_by时出现报错,默认的sql-mode里的ONLY_FULL_GROUP_BY字段导致不能直接查询group_by包裹的之外的字段,如下使用,只查询group_by的字段可以正常使用,但是同时查询create_time和count字段会出现错误:

# 正确
session.query(Table.count).group_by(Table.count).all()
# 报错
session.query(Table.create_time,Table.count).group_by(Table.count).all()
  • 解决办法:

不建议sql_mode为空,因为会有数据丢失的风险,故推荐使用第二种解决方法。

1. 修改sql_mode

    设置: 在mysql的conf文件中加上`sql_mode=""`这一行
    

2. 程序中改变查询语句的写法,group_by之外的字段使用func函数包围

    为了符合ONLY_FULL_GROUP_BY=True的要求,如下:


    那么在程序中正确  的写法应为:

```python
from sqlalchemy import func

objs = session.query(func.any_value(Table.create_time),Table.count).group_by(Table.count).all()
# 注意:这样生成的数据结果为[(),()],列表中的结果是元组,而不是生成器,如果要对结果进行解析,解析方式也跟原来的方式不一样

obj = session.query(func.any_value(Table.create_time),Table.count).group_by(Table.count).first()
# 但是如果在这样的写法中只需要使用count字段,写成obj.count是可以的
```

order_by

sqlalchemy.exc.InterfaceError

  • 错误详情
sqlalchemy.exc.InterfaceError: (_mysql_exceptions.InterfaceError) (-1, 'error totally whack') 
from sqlalchemy import desc
from sqlalchemy.sql.functions import concat


base_query = session.query(Table).filter(
    Table.cluster_id == 1,
    Table.status.in_([Table.FINISH, Table.RUNNING])).order_by(
    # 正确写法
    getattr(Table, "create_time").desc())
    # 错误写法
    # desc("create_time"))  # 只有first会出错, all/one查询不会出错
data = base_query.first()
print("status: {}".format(data.status))

上一篇 python项目结构     下一篇 ubuntu相关软件
目录导航