Skip to content
Snippets Groups Projects
Commit f8d87fe0 authored by Pierre-Yves David's avatar Pierre-Yves David
Browse files

Migration to psycopg3

parent 9f71b52b
No related branches found
No related tags found
No related merge requests found
Pipeline #14002 failed
......@@ -18,7 +18,6 @@ swh.storage >= 0.1.1
types-beautifulsoup4
types-cryptography
types-docutils
types-psycopg2
types-Pygments
types-pyyaml
types-requests
\ No newline at end of file
types-requests
......@@ -19,7 +19,6 @@ iso8601
looseversion
msgpack
prometheus-client
psycopg2
pybadges >= 2.2.1
pygments
pymemcache
......
......@@ -5,9 +5,9 @@
from __future__ import annotations
import psycopg2
import psycopg2.extensions
from psycopg2.extras import execute_values
from typing import Any
import psycopg
from django.core.management.base import BaseCommand
from django.db import transaction
......@@ -20,14 +20,14 @@ from swh.web.mailmap.models import UserMailmap
DISABLE_MAILMAPS_QUERY = """\
UPDATE person
SET displayname = NULL
FROM (VALUES %s) AS emails (email)
FROM (VALUES (%s)) AS emails (email)
WHERE person.email = emails.email
"""
REFRESH_MAILMAPS_QUERY = """\
UPDATE person
SET displayname = displaynames.displayname
FROM (VALUES %s) AS displaynames (email, displayname)
FROM (VALUES (%s, %s)) AS displaynames (email, displayname)
WHERE
person.email = displaynames.email
AND person.displayname IS DISTINCT FROM displaynames.displayname
......@@ -47,24 +47,22 @@ class Command(BaseCommand):
def disable_mailmaps(
self,
storage_db: psycopg2.extensions.connection,
storage_db: psycopg.Connection[Any],
mailmaps: QuerySet[UserMailmap, UserMailmap],
):
"""Return the SQL to disable a set of mailmaps"""
execute_values(
storage_db.cursor(),
storage_db.cursor().executemany(
DISABLE_MAILMAPS_QUERY,
((mailmap.from_email.encode("utf-8"),) for mailmap in mailmaps),
)
def refresh_mailmaps(
self,
storage_db: psycopg2.extensions.connection,
storage_db: psycopg.Connection[Any],
mailmaps: QuerySet[UserMailmap, UserMailmap],
):
execute_values(
storage_db.cursor(),
storage_db.cursor().executemany(
REFRESH_MAILMAPS_QUERY,
(
(
......@@ -99,7 +97,7 @@ class Command(BaseCommand):
)
)
with psycopg2.connect(options["storage_dbconn"]) as db:
with psycopg.connect(options["storage_dbconn"]) as db:
self.disable_mailmaps(db, to_disable.select_for_update())
self.refresh_mailmaps(db, to_refresh.select_for_update())
if not options["perform"]:
......
......@@ -6,8 +6,6 @@
import datetime
import json
import psycopg2
from psycopg2.extras import execute_values
import pytest
from swh.model.model import Person
......@@ -385,9 +383,6 @@ MAILMAP_KNOWN_PEOPLE = tuple(
def init_stub_storage_db(postgresql):
if not isinstance(postgresql, psycopg2.extensions.connection):
# wrap pytest-postgresql >= 4's psycopg3 connection into a psycopg2 one
postgresql = psycopg2.connect(postgresql.info.dsn)
cur = postgresql.cursor()
cur.execute(
"""
......@@ -399,11 +394,16 @@ def init_stub_storage_db(postgresql):
)
"""
)
execute_values(
cur,
"INSERT INTO person (fullname, name, email) VALUES %s",
(p.to_dict() for p in MAILMAP_KNOWN_PEOPLE),
template="(%(fullname)s, %(name)s, %(email)s)",
cur.executemany(
"INSERT INTO person (fullname, name, email) VALUES (%s, %s, %s)",
[
(
d["fullename"],
d["name"],
d["email"],
) for d in
(p.to_dict() for p in MAILMAP_KNOWN_PEOPLE)
]
)
cur.execute("CREATE INDEX ON person (email)")
postgresql.commit()
......
......@@ -57,9 +57,9 @@ REST_FRAMEWORK["NUM_PROXIES"] = 2
db_conf = swh_web_config["production_db"]
if db_conf.get("name", "").startswith("postgresql://"):
# poor man's support for dsn connection string...
import psycopg2
import psycopg
with psycopg2.connect(db_conf.get("name")) as cnx:
with psycopg.connect(db_conf.get("name")) as cnx:
dsn_dict = cnx.get_dsn_parameters()
db_conf["name"] = dsn_dict.get("dbname")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment