Каким образом составить запрос в SQLAlchemy для PostgreSQL?

Рейтинг: 0Ответов: 1Опубликовано: 03.02.2023

Как добавить схему в запросы SQLAlchemy? Я так понимаю ошибка в том, что при запросе нужно указывать схему и таблицу users.users в PostgreSQL, но как это сделать в SQLAlchemy ORM?

Код запроса

async def new_user(db: Session):
    user = Users(id=1, email="user@example.ru", hashed_password="lasdfhi18c74i6criuytkyutvjtfvj", api_key="12345sakhdjgfsadkhfl264ocb8")
    db.add(instance=user)
    db.commit()
Схема базы данных

class Users(Base):
    __tablename__ = "users"
    id: Mapped[int] = mapped_column(primary_key=True, unique=True)
    email: Mapped[str] = mapped_column(unique=True)
    hashed_password: Mapped[str]
    api_key: Mapped[str] = mapped_column(unique=True)
    services: Mapped["Notifications"] = relationship(back_populates="owner")


class Notifications(Base):
    __tablename__ = "notifications"
    api_key: Mapped[str] = mapped_column(ForeignKey(Users.api_key), primary_key=True, unique=True)
    email: Mapped[str] = mapped_column(unique=True)
    telegram_id: Mapped[int] = mapped_column(unique=True)
    vk_domain: Mapped[str] = mapped_column(unique=True)
    website: Mapped[str] = mapped_column(unique=True)
    owner: Mapped["Users"] = relationship(back_populates="services")
Трассировка стека

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 407, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 78, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\fastapi\applications.py", line 270, in __call__
    await super().__call__(scope, receive, send)
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\starlette\applications.py", line 124, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
    raise exc
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\starlette\middleware\exceptions.py", line 79, in __call__
    raise exc
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\starlette\middleware\exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "C:\Users\maksi\AppData\Local\Programs\Python\Python311\Lib\contextlib.py", line 222, in __aexit__
    await self.gen.athrow(typ, value, traceback)
  File "C:\Users\maksi\PycharmProjects\team_project\venv\Lib\site-packages\fastapi\concurrency.py", line 36, in contextmanager_in_threadpool
    raise e
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) ОШИБКА:  отношение "users" не существует
LINE 1: INSERT INTO users (id, email, hashed_password, api_key) VALU...
                    ^

[SQL: INSERT INTO users (id, email, hashed_password, api_key) VALUES (%(id)s, %(email)s, %(hashed_password)s, %(api_key)s)]
[parameters: {'id': 1, 'email': 'user@example.ru', 'hashed_password': 'lasdfhi18c74i6criuytkyutvjtfvj', 'api_key': '12345sakhdjgfsadkhfl264ocb8'}]
(Background on this error at: https://sqlalche.me/e/20/f405)

Ответы

▲ 0Принят

Как ответили в комментариях - нужно было добавить схему, в которой будут создаваться таблицы, в определении класса __table_args__ = {"schema": "users"}