Postgresql错误声明太大了

时间:2016-03-12 07:39:55

标签: python postgresql python-3.x sqlalchemy psycopg2

我在python和sqlalchemy上开发了一个脚本来获取和更新我的活跃用户的最后一个活动。

但是用户增加了很多,现在我收到了以下错误

psycopg2.ProgrammingError: Statement is too large. Statement Size: 16840277 bytes. Maximum Allowed: 16777216 bytes

我在想是否更新文件 postgres.conf 它会起作用,所以在pgtune的帮助下我更新了文件,但它不起作用,所以我在 /etc/syslog.conf ,包含以下参数

kern.sysv.shmmax=4194304
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.sysv.shmall=1024

再次无效。

之后我将查询分成片以减小大小,但我得到了同样的错误。

如何知道我需要更新哪个参数,以增加我的语句的大小?

工作流

query = "SELECT id FROM {}.{} WHERE status=TRUE".format(schema, customer_table)
ids = ["{}".format(i)for i in pd.read_sql(query, insert_uri).id.tolist()]

read_query = """
SELECT id,
 MAX(CONVERT_TIMEZONE('America/Mexico_City', last_activity)) lastactivity
FROM activity WHERE
DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', last_activity)) =
DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', CURRENT_DATE))-{} and
 id in ({})
GROUP BY id
""".format(day, ",".join(ids))

last_activity = pd.read_sql(read_query, read_engine, parse_dates=True)

1 个答案:

答案 0 :(得分:3)

如果您只是从数据库中获取ID而不是通过任何其他方式过滤它们,则根本不需要获取它们,您只需将SQL语句作为子查询插入第二个:

SELECT id,
 MAX(CONVERT_TIMEZONE('America/Mexico_City', last_activity)) lastactivity
FROM activity WHERE
 DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', last_activity)) =
 DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', CURRENT_DATE))-%s and
 id in (
    SELECT id FROM customerschema.customer WHERE status=TRUE
 )
GROUP BY id

另外,正如Antti Haapala所说,不要对SQL参数使用字符串格式,因为它是不安全的,如果任何参数包含适当的引号,postgres会将它们解释为命令而不是数据。< / p>