0

Я начал пользоваться фреймворком FastAPI и подключил к нему SQLAlchemy, что в общем-то и не очень радует потому что я не люблю подключать к своему коду лишние абстракции, но исходя из мнений в интернете и того, что сами создатели фреймворка в примерах рекомендуют эту ORM решил все-таки воспользоваться ей.

Ошибка следующая:

asyncpg.exceptions.DataError: invalid input for query argument $1: 'lalala@gmail.com' (a bytes-like object is required, not 'str')

Файл db.py пакета storage:

from databases import Database
import sqlalchemy

address = ""

storage = Database(address)

metadata = sqlalchemy.MetaData()

consumers = sqlalchemy.Table( "consumers", metadata, sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True), sqlalchemy.Column("first_name", sqlalchemy.String), sqlalchemy.Column("last_name", sqlalchemy.String), sqlalchemy.Column("email", sqlalchemy.String, unique=True), sqlalchemy.Column("password", sqlalchemy.String) )

engine = sqlalchemy.create_engine(address)

metadata.create_all(engine)

Мой код получения, размещенный в пакете storage в файле utils.py:

from .db import consumers, storage

async def get_user_by_email(email: str): return await storage.fetch_one( consumers.select().where(consumers.c.email == email) )

Файл models.py из пакета authentication:

from pydantic import BaseModel, EmailStr

class CreateConsumer(BaseModel): email: EmailStr first_name: str last_name: str password: str confirm_password: str

Файл routes.py из пакета authentication:

from fastapi import APIRouter
from .models import CreateConsumer
from storage.utils import get_user_by_email

authentication = APIRouter()

@authentication.post('/sign-up') async def sign_up(user: CreateConsumer): if await get_user_by_email(user.email): pass

Crazy Theory
  • 442
  • 3
  • 14
  • У тебя есть явная ошибка a bytes-like object is required, not 'str', т.е. где-то ожидается bytes-like object, а приходит строка. Поиск по ошибке кинул на https://stackoverflow.com/questions/33054527/typeerror-a-bytes-like-object-is-required-not-str-when-writing-to-a-file-in Там ошибка именно при записи. У тебя ошибка при записи вылетает? – Aleksey Oct 31 '20 at 08:39
  • я запрос в бд делаю на получение, а не на запись. consumers.select() это обращение к таблице, а далее идет where. – Crazy Theory Oct 31 '20 at 09:04

1 Answers1

0

Решил проблему заменив поле email в таблице text'ом вместо char'а. Видимо какое-то несоответствие в типах данных происходило.

Crazy Theory
  • 442
  • 3
  • 14