Как читать и вставлять данные в postgres с помощью sqlalchemy

#python #fastapi

Вопрос:

У меня есть следующие модели sql-алхимии. Я хочу вставить данные в пользовательские таблицы, но не удалось. Я использую postgres с sqlalchemy и fastapi

 class Group(Base):
    __tablename__ = "groups"

    id = Column(
        Integer,
        primary_key=True,
        server_default=text("nextval('parties_id_seq'::regclass)"),
    )
    group_type = Column(
        Enum(
            "user",,
            "partner",,
            name="group_type",
        ),
        index=True,
    )

class User(Group):
    __tablename__ = "users"


    id = Column(ForeignKey("groups.id"), primary_key=True)
    username = Column(String(100), nullable=False, unique=True)
    email = Column(String(150), nullable=False, unique=True)
    referral_id = Column(ForeignKey("users.id"))

    referral = relationship("User", remote_side=[id])
 

Я хочу запросить данные на основе электронной почты, а затем вставить данные в таблицу пользователей, но получил следующие ошибки:

 sqlalchemy.exc.InvalidRequestError: Query contains no columns with which to SELECT from.

 

Вот что я пробовал до сих пор:

 def get_user_by_email(db: Session, email: str):
    return db.query().filter(user_model.User.email == email).first()

def create_user(db: Session, user: user_pydantic.UserCreate):
    db_user = user_model.User(
        username=user.username,
        email=user.email,
    )
    db.add(db_user)
    db.commit()
    db.refresh(db_user)

    return db_user

def create_user(user: UserCreate, db: Session = Depends(get_db)):
    db_user = user_service.get_user_by_email(db, email=user.email)
    if db_user:
        return db_user
    if db_user:
        raise HTTPException(status_code=400, detail="Username already registered")
    return user_service.create_user(db=db, user=user)
 

Ответ №1:

Вам нужно определить столбец в вашем запросе:

 def get_user_by_email(db: Session, email: str):
    return db.query(user_model.User).filter(user_model.User.email == email).first()