aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--metricity/exts/event_listeners/guild_listeners.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/metricity/exts/event_listeners/guild_listeners.py b/metricity/exts/event_listeners/guild_listeners.py
index 9ad0bda..0d26ba7 100644
--- a/metricity/exts/event_listeners/guild_listeners.py
+++ b/metricity/exts/event_listeners/guild_listeners.py
@@ -3,7 +3,7 @@
import discord
from discord.ext import commands
from pydis_core.utils import logging, scheduling
-from sqlalchemy import update
+from sqlalchemy import column, update
from sqlalchemy.dialects.postgresql import insert
from metricity import models
@@ -56,11 +56,12 @@ class GuildListeners(commands.Cog):
log.info("Performing bulk upsert of %d rows", len(users))
user_chunks = discord.utils.as_chunks(users, 500)
+ created = 0
+ updated = 0
async with async_session() as sess:
for chunk in user_chunks:
- log.info("Upserting chunk of %d", len(chunk))
- qs = insert(models.User).values(chunk)
+ qs = insert(models.User).returning(column("xmax")).values(chunk)
update_cols = [
"name",
@@ -74,11 +75,19 @@ class GuildListeners(commands.Cog):
"pending",
]
- await sess.execute(qs.on_conflict_do_update(
+ res = await sess.execute(qs.on_conflict_do_update(
index_elements=[models.User.id],
set_={k: getattr(qs.excluded, k) for k in update_cols},
))
+ objs = list(res)
+
+ created += [obj[0] == 0 for obj in objs].count(True)
+ updated += [obj[0] != 0 for obj in objs].count(True)
+
+ log.info("User upsert: inserted %d rows, updated %d rows, total %d rows",
+ created, updated, created + updated)
+
await sess.commit()
log.info("User upsert complete")