我有一个sqlalchemy查询,该查询使用一些窗口函数在列上实现lag()。如果重要的话,后端将使用Teradata。
我收到一个数据库错误,这提示我参数值未正确替换。如果我在数据库中运行裸查询,则会得到完全相同的错误。
表被定义为基类的扩展,并以通常的方式从数据库反映出来。
sqlalchemy代码:
name = 'some_column'
query = self.session\
.query(func.min(getattr(table,name))\
.over(partition_by=over_attrs,
order_by=getattr(table,name),
rows=(1,1)))
产生以下sql:
SELECT min(my_table_1.my_date)
OVER (PARTITION BY my_table_1.ban, my_table_1.location
ORDER BY my_table_1.my_date ROWS
BETWEEN ? FOLLOWING AND ? FOLLOWING) AS anon_1
FROM schema.my_table AS my_table_1
我收到的错误消息是:
(teradata.api.DatabaseError) (3707, "[42000] [Teradata]
[ODBC Teradata Driver][Teradata Database] Syntax error,
expected something like a name or a Unicode delimited identifier
or an integer between the 'BETWEEN' keyword and '?'. ")
[SQL: 'SELECT TOP 25 min(my_table_1.my_date)
OVER (PARTITION BY my_table_1.ban, my_table_1.location
ORDER BY my_table_1.my_date ROWS BETWEEN ? FOLLOWING AND ? FOLLOWING) AS anon_1 \n
FROM schema.my_table AS my_table_1'] [parameters: (1, 1)]
(Background on this error at: http://sqlalche.me/e/4xp6)
如果我在数据库中用{{1,1)替换?
来运行查询,则查询运行良好。如果我留在?
中,那么它将失败,并显示与sqlalchemy版本完全相同的错误。
我做错了什么会导致它以这种方式失败,或者这可能是sqlalchemy中的错误吗?
版本:
SQLAlchemy 1.2.8
sqlalchemy-teradata 0.1.0.dev0
pyodbc 4.0.23
我正在使用Teradata数据库ODBC驱动程序v 16.10。