Wpis z mikrobloga

Osoby Pythonowe i Bazondanowe proszone są o pomoc ( ͡° ͜ʖ ͡°)

Mam model w którym wykorzystuję typ "CITEXT". Do testów muszę stworzyć fiksturę która zrobi mi migrację oraz zarejestruje wspomniany typ. Niby mi się to udaje ale nie do końca ( ͡° ʖ̯ ͡°)
Na czas dochodzenia zrobiłem sobie taki oto skrypcik:

import os
from sqlalchemy import create_engine, text
from wykop.models import Base
engine = create_engine(os.getenv("POSTGRES_DATABASE_URI"))
connection = engine.connect()
connection.execute(text("SHOW search_path;")).fetchone()
connection.execute(text("SET search_path TO public;"))
connection.execute(text("SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'citext');")).fetchone()
connection.execute(text("CREATE EXTENSION IF NOT EXISTS citext;"))
connection.execute(text("SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'citext');")).fetchone()
engine.dispose()
engine = create_engine(os.getenv("POSTGRES_DATABASE_URI"))
connection = engine.connect()
connection.execute(text("SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'citext');")).fetchone()
Base.metadata.create_all(bind=engine)

Cały problem polega na tym, że mimo, że drugie wywołanie komendy:

connection.execute(text("SELECT EXISTS (SELECT 1 FROM pgextension WHERE extname = 'citext');")).fetchone()


zwraca True to trzecie zwraca False i nie ma szans wykonania:

Base.metadata.create_all(bind=engine)


bo otrzymuję error:

*** sqlalchemy.exc.ProgrammingError: (psycopg.errors.UndefinedObject) type "citext" does not exist


Zatem nie udało się trwale zarejestrować typu "CITEXT".

Z GPT zatoczyłem koło po którym zaczął dawać ponownie te same odpowiedzi.
Czegoś mi tu brakuje. Może źle kończę połączenie? Próbowałem wielu innych metod znalezionych na stacku i w tutorialach. Wynik za każdym razem jest ten sam.

#python #bazydanych
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@gokihar: Bardziej chodziło mi o wskazanie czego nie kumam w zapisie do bazy danych. Niby robię tak samo jak inni i dopóki muszę działać z typami danych natywnymi dla bazy to działa ale gdy muszę zarejestrować typ tak jak tutaj to niestety nie udaje mi się.
  • Odpowiedz
@Patrick_Rowerovsky: z czapy dwie opcje:

1. może potrzebujesz jeszcze .commit() żeby zapisać zmiany na koniec pierwszej sesji engine, nie pamiętam
2. dla pierwszej instancji engine ustawiasz explicite search_path, może w drugiej po prostu szuka w złym miejscu
  • Odpowiedz