我在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)
答案 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>