python - 从 SQLAlchemy declarative_base 定义的表中选择
问题描述
我正在研究 FastAPI 教程,我正在尝试使用 SQLAlchemy+Alembic+ databases创建表。
在我的main.py
我有:
from typing import List
import databases
import sqlalchemy
from fastapi import FastAPI
from pydantic import BaseModel
from sqlalchemy import Table
DATABASE_URL = "sqlite:///./test.db"
database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()
notes = sqlalchemy.Table(
"note",
metadata,
sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
sqlalchemy.Column("text", sqlalchemy.String),
sqlalchemy.Column("completed", sqlalchemy.Boolean),
)
class Note2(BaseModel):
id: int
text: str
completed: bool
app = FastAPI()
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
@app.get("/notes/", response_model=List[Note2])
async def read_notes():
query = notes.select()
return await database.fetch_all(query)
这有效 - 我可以GET
/notes/端点。但是在具有端点的同一模块中创建数据库表看起来很新手,所以我决定制作models.py
文件并在那里创建一个普通模型,如下所示:
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Note(Base):
__tablename__ = "note"
id = sa.Column(sa.Integer, primary_key=True)
text = sa.Column(sa.String)
completed = sa.Column(sa.Boolean)
这里出现了一个问题 - 当我像这样更改端点时:
from app_second.models import Note
@app.get("/notes/", response_model=List[Note2])
async def read_notes():
query = Note().select()
return await database.fetch_all(query)
我收到一个错误:
AttributeError:“注意”对象没有属性“选择”
正如这里提到的-declarative_base()
只是Table
+的语法 shugar mapper
。但是以这种方式声明的选择/过滤/更新表的正确方法是什么?
解决方案
您可以使用table属性来访问 table 方法,然后使用 database.fetch_all() 或类似的。例如:
from sqlalchemy import select
...
skip = 0
limit = 100
query = (
Note.__table__.select()
.offset(skip)
.limit(limit)
)
return await database.fetch_all(query)
推荐阅读
- c++ - 如何阅读复杂的类型?
- java - 没有感觉长度()结果
- applozic - Applozic API - 获取完整图像
- php - DB 中的日期与 Laravel 中的结果不同
- flutter - 如何在颤动中处理文件的空安全性?
- python - 无法访问 Azure IoT Edge API 模块。请求超时
- python - 使用 TriggerDagRunOperator 从没有执行日期触发的子 dag 返回值
- javascript - 如何将所选图像设置为在 Angular 的引导轮播中显示的第一个图像?
- javascript - 简单的事件监听器reactjs不起作用
- java - itext7在pdfa的标题中嵌入字体仅1次