Однако мой Postgres развернут в Google Cloud, и для подключения к нему я создаю соединитель Google Cloud и вместе с ним механизм SQLAlchemy:
Код: Выделить всё
from google.cloud.sql.connector import Connector
connector = Connector()
try:
# Creator function for SQLAlchemy engine
def getconn():
return connector.connect(
CLOUD_SQL_INSTANCE,
"pg8000",
user=DATABASE_USER,
password=DATABASE_PASSWORD,
db=DATABASE_NAME,
)
# Create SQLAlchemy engine
engine = create_engine("postgresql+pg8000://", creator=getconn)
Однако vecs не позволяет создать клиент, передав создателя движка или готовый движок SQLAlchemy. Кажется, он принимает только строку подключения.
Я пропатчил метод __init__ класса Client класса Vecs, и он сработал:
Код: Выделить всё
from sqlalchemy import text
from vecs import Client
from books_vector_db.utils.db import engine
def _patched_init(self, engine):
self.engine = engine
from sqlalchemy import MetaData
from sqlalchemy.orm import sessionmaker
self.meta = MetaData(schema="vecs")
self.Session = sessionmaker(self.engine)
with self.Session() as sess:
with sess.begin():
sess.execute(text("create schema if not exists vecs;"))
sess.execute(text("create extension if not exists vector;"))
self.vector_version: str = sess.execute(
text(
"select installed_version from pg_available_extensions where name = 'vector' limit 1;"
)
).scalar_one()
Client.__init__ = _patched_init
def get_vecs_client() -> Client:
return Client(engine)
Есть идеи, как использовать готовый движок SQLAlchemy без обезьяньих исправлений библиотеки vec или более законный способ подключения клиента vecs к моей базе данных GCP?
Подробнее здесь: https://stackoverflow.com/questions/797 ... chemy-engi