我开始使用 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文件:
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)
我的检索代码,放在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文件:
from pydantic import BaseModel, EmailStr
class CreateConsumer(BaseModel):
email: EmailStr
first_name: str
last_name: str
password: str
confirm_password: str
身份验证包中的routes.py文件:
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
我通过用文本而不是字符替换表中的电子邮件字段解决了这个问题。显然发生了某种数据类型的不匹配。