SQLAlchemy:ProgrammingError 但打印的 SQL 语句有效?
SQLAlchemy: ProgrammingError but the printed SQL statement works?
我正在尝试使用 SQLAlchemy 对每个月在 table 中找到的行数进行分组和计数。
函数如下:
def query_testing(
session: scoped_session,
from_date: datetime,
to_date: datetime,
):
qry = (
session.query(
func.count(U4.index).label("count"),
func.dateadd(
text("month"),
func.datediff(text("month"), 0, U4.arrival),
0,
).label("received"),
)
.filter(
cast(U4.arrival, Date) >= from_date,
cast(U4.arrival, Date) <= to_date,
)
.group_by(
func.dateadd(
text("month"),
func.datediff(text("month"), 0, U4.arrival),
0,
),
)
.order_by(
func.dateadd(
text("month"),
func.datediff(text("month"), 0, U4.arrival),
0,
)
)
)
不幸的是,使用 qry.all()
执行查询会导致编程错误:
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Column 'u4erp.received' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
当我 print(qry)
语句并尝试手动执行生成的 SQL 时,语句有效(在手动将 ?
更改为其预期值之后)。打印语句如下:
SELECT
count(u4erp.[index]) AS count,
dateadd(MONTH, datediff(MONTH, 0, u4erp.received), 0) AS received
FROM
u4erp
WHERE
CAST(
u4erp.received AS DATE
) >= '2020-01-01'
AND CAST(
u4erp.received AS DATE
) <= '2021-12-31'
GROUP BY
dateadd(MONTH, datediff(MONTH, 0, u4erp.received), 0)
ORDER BY
dateadd(MONTH, datediff(MONTH, 0, u4erp.received), 0)
是什么导致打印的 SQL 语句有效,但在使用 SQLAlchemy 时引发编程错误?我该如何解决?
我使用 text
.
为我的特定用例找到了解决方法
def query_testing(
session: scoped_session,
from_date: datetime,
to_date: datetime,
):
qry = (
session.query(
func.count(U4.index).label("count"),
text(
"DATEADD(MONTH, DATEDIFF(MONTH, 0, "
"u4erp.received), 0) AS received"
),
)
.filter(
cast(U4.arrival, Date) >= from_date,
cast(U4.arrival, Date) <= to_date,
)
.group_by(
text(
"DATEADD(MONTH, DATEDIFF(MONTH, 0, "
"u4erp.received), 0)"
),
)
.order_by(
text(
"DATEADD(MONTH, DATEDIFF(MONTH, 0, "
"u4erp.received), 0)"
),
)
)
我正在尝试使用 SQLAlchemy 对每个月在 table 中找到的行数进行分组和计数。
函数如下:
def query_testing(
session: scoped_session,
from_date: datetime,
to_date: datetime,
):
qry = (
session.query(
func.count(U4.index).label("count"),
func.dateadd(
text("month"),
func.datediff(text("month"), 0, U4.arrival),
0,
).label("received"),
)
.filter(
cast(U4.arrival, Date) >= from_date,
cast(U4.arrival, Date) <= to_date,
)
.group_by(
func.dateadd(
text("month"),
func.datediff(text("month"), 0, U4.arrival),
0,
),
)
.order_by(
func.dateadd(
text("month"),
func.datediff(text("month"), 0, U4.arrival),
0,
)
)
)
不幸的是,使用 qry.all()
执行查询会导致编程错误:
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Column 'u4erp.received' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
当我 print(qry)
语句并尝试手动执行生成的 SQL 时,语句有效(在手动将 ?
更改为其预期值之后)。打印语句如下:
SELECT
count(u4erp.[index]) AS count,
dateadd(MONTH, datediff(MONTH, 0, u4erp.received), 0) AS received
FROM
u4erp
WHERE
CAST(
u4erp.received AS DATE
) >= '2020-01-01'
AND CAST(
u4erp.received AS DATE
) <= '2021-12-31'
GROUP BY
dateadd(MONTH, datediff(MONTH, 0, u4erp.received), 0)
ORDER BY
dateadd(MONTH, datediff(MONTH, 0, u4erp.received), 0)
是什么导致打印的 SQL 语句有效,但在使用 SQLAlchemy 时引发编程错误?我该如何解决?
我使用 text
.
def query_testing(
session: scoped_session,
from_date: datetime,
to_date: datetime,
):
qry = (
session.query(
func.count(U4.index).label("count"),
text(
"DATEADD(MONTH, DATEDIFF(MONTH, 0, "
"u4erp.received), 0) AS received"
),
)
.filter(
cast(U4.arrival, Date) >= from_date,
cast(U4.arrival, Date) <= to_date,
)
.group_by(
text(
"DATEADD(MONTH, DATEDIFF(MONTH, 0, "
"u4erp.received), 0)"
),
)
.order_by(
text(
"DATEADD(MONTH, DATEDIFF(MONTH, 0, "
"u4erp.received), 0)"
),
)
)