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

为什么POSTGRESQL的row_number()窗口函数在psycopg2中不起作用,但在命令行或pgadmin中起作用?,postgresql,psycopg2,Postgresql,Psycopg2,我有以下查询来找出某个数据的行号 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, tod

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

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命令行中执行相同的查询,如下所示。它很好用

select row_number from (select row_number() over(order by date desc), * from contest where date <= '2017-5-5' order by date LIMIT (select count(*) from contest where date <='2017-5-5' ) - 1) as new WHERE date = '2017-2-1'
我使用最新版本的postgresql和psycopg2

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

虽然我不知道您的查询试图做什么,但在我使用它创建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配合使用。问题似乎在别处。

根据托梅茨基的测试,问题很可能是不可打印字符或类似字符

尝试打开log\u error\u verbosity=verbose并查看PostgreSQL错误日志以了解更多详细信息

还可以在打开不可打印字符显示的情况下检查源文件


否则。。。。你有多确定你从Psycopg2和psql连接到同一个DB和同一个postgres版本?

我认为这与角色有关。我刚刚将查询复制到我的pgadmin4中,它在select前面显示了一个红点,并显示为“\ufeff”。这是否意味着一些损坏的代码进入了查询,无法翻译?我该怎么解决这个问题?谢谢。你是对的。文件中有此\ufeff字符。不止一个地方,还有六个。选择关键字前的所有右键。你知道如何检查我的文件中是否有坏字符并删除它们吗?这是零宽度的不间断空间。我不确定它是如何实现的,你使用什么编辑器?你经常在事物之间来回复制和粘贴查询吗?是的,事实上我就是这么做的。我在pgadmin4中编写查询,并将其复制并粘贴到pycharm上的python文件中。pycharm中有编码选项,但不确定如何使用它来去除字符。所以我用空字符串替换了所有\ufeff字符。但只有当我知道我应该寻找什么样的角色时,这才有效。我想知道是否有办法系统地检查这种事情。什么是零宽度不间断空间?如何在档案中发现它?是的,问题在别处。这是一个性格问题。
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)
)