为什么POSTGRESQL的row_number()窗口函数在psycopg2中不起作用但在命令行或pgadmin中有效?

时间:2017-05-07 08:28:44

标签: postgresql psycopg2

我有以下查询来查找某个数据的行号。

-05:00

当我执行此查询时,收到此错误消息

cursor.execute("select row_number from (select row_number() over(order by date desc), * from contest where date <= %s order by date LIMIT (select count(*) from contest where date <= %s) - 1) as new WHERE date = %s", (today, today ,date))

我在pgadmin4或postgresql命令行中执行相同的查询,如下所示。它工作正常。

psycopg2.ProgrammingError
psycopg2.ProgrammingError: syntax error at or near "select"
LINE 1: select row_number from (select row_number() over(order by d...

我使用最新版本的postgresql和psycopg2。

我被困在这里。我无法找到答案。 我需要一些帮助。

2 个答案:

答案 0 :(得分:2)

虽然我不知道您的查询尝试做什么,但是当我从中创建SSCCE时,没有语法错误并且它有效:

import psycopg2, datetime

conn = psycopg2.connect("")
cursor = conn.cursor()

cursor.execute("create temporary table contest(id serial primary key, date date not null)")
cursor.execute("insert into contest (date) values (%s)", ("2000-01-01",))

today = datetime.date.today()
date = today-datetime.timedelta(days=1)
cursor.execute("""
    select row_number from (
        select row_number() over(order by date desc), *
        from contest
        where date <= %s
        order by date
        LIMIT ( select count(*) from contest where date <= %s) - 1
    ) as new
    WHERE date = %s""",
    (today, today, date)
)

适用于Python-3.5 / psycopg2-2.7.1和Python-2.7 / psycopg2-2.6.2。问题似乎在其他地方。

答案 1 :(得分:1)

鉴于Tometzky的测试,该问题很可能是一个不可打印的角色或类似的。

尝试启用log_error_verbosity = verbose并检查PostgreSQL错误日志以获取更多详细信息。

同时检查打开了不可打印字符显示的源文件。

否则....你是否确定从Psycopg2连接到与psql相同的数据库和相同的postgres版本?