Postgresql报错语句太大
Postgresql error statement is too large
我在 python 和 sqlalchemy 上开发了一个脚本来获取和更新我最后的 activity 个活跃用户。
但是用户增加了很多,现在我收到以下错误
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)
如果您只是从数据库中获取 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 将将它们解释为命令而不是数据。
我在 python 和 sqlalchemy 上开发了一个脚本来获取和更新我最后的 activity 个活跃用户。
但是用户增加了很多,现在我收到以下错误
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)
如果您只是从数据库中获取 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 将将它们解释为命令而不是数据。