为什么 POSTGRESQL 的 row_number() window 函数在 psycopg2 中不起作用,但在命令行或 pgadmin 中起作用?
Why does row_number() window function of POSTGRESQL not working in psycopg2 but works in command line or pgadmin?
我有以下查询来找出特定数据的行号。
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))
当我执行这个查询时,我收到这个错误消息
psycopg2.ProgrammingError
psycopg2.ProgrammingError: syntax error at or near "select"
LINE 1: select row_number from (select row_number() over(order by d...
然后我在 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。问题似乎出在其他地方。
根据 Tometzky 的测试,问题很可能是不可打印字符或类似字符。
尝试打开 log_error_verbosity = verbose
并检查 PostgreSQL 错误日志以获取更多详细信息。
同时检查打开不可打印字符显示的源文件。
否则....您如何确定您从 Psycopg2 连接到与从 psql 连接到相同的数据库和相同的 postgres 版本?
我有以下查询来找出特定数据的行号。
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))
当我执行这个查询时,我收到这个错误消息
psycopg2.ProgrammingError
psycopg2.ProgrammingError: syntax error at or near "select"
LINE 1: select row_number from (select row_number() over(order by d...
然后我在 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。问题似乎出在其他地方。
根据 Tometzky 的测试,问题很可能是不可打印字符或类似字符。
尝试打开 log_error_verbosity = verbose
并检查 PostgreSQL 错误日志以获取更多详细信息。
同时检查打开不可打印字符显示的源文件。
否则....您如何确定您从 Psycopg2 连接到与从 psql 连接到相同的数据库和相同的 postgres 版本?