Python 从SQLAlchemy声明性_base定义的表中选择

Python 从SQLAlchemy声明性_base定义的表中选择,python,sqlalchemy,fastapi,Python,Sqlalchemy,Fastapi,我正在编写FastAPI教程,并尝试使用SQLAlchemy+Alembic+创建表。 在mymain.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" dat

我正在编写FastAPI教程,并尝试使用SQLAlchemy+Alembic+创建表。
在my
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)
这很有效-我可以
获取
/notes/端点。但是在具有端点的同一模块中创建datatabase表看起来是新手,所以我决定创建
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()
只是
+
映射器
的一个语法shugar。但是,选择/筛选/更新以这种方式声明的表的正确方法是什么呢?

注意
是一个ORM模型,因此您必须执行
session.query(Note).filter(…)
<代码>注释
是一个
,可以作为
注释访问。
@snakecharmerb是的,我认为它应该与正常的SQLALchemy流一起工作,但我正在尝试使用
数据库
使代码异步-并且它不使用
会话
(至少在教程中,它是像我所做的那样).@snakecharmerb但看起来像
注释。_utable\u uu.select()
也起作用。:)但这是最好的方法吗?通常,在python代码中使用dunder方法/属性看起来不是一个好方法FastApi@snakecharmerb但正如我所见,端点是同步的,没有
async def…
对我来说,这部分教程看起来就像是对同步数据库连接的解释…
Note
是一个ORM模型,所以您必须执行
session.query(Note).filter(…)
<代码>注释是一个
,可以作为
注释访问。
表@snakecharmerb是的,我认为它应该与正常的SQLALchemy流一起工作,但我正在尝试使用
数据库
使代码异步-并且它不使用
会话
(至少在教程中,它是像我所做的那样).@snakecharmerb但看起来像
注释。_utable\u uu.select()
也起作用。:)但这是最好的方法吗?通常,在python代码中使用dunder方法/属性看起来不是一个好方法FastApi@snakecharmerb但正如我所见,端点是同步的,如果没有
async def…
,对于我来说,教程的这一部分看起来就像是对同步数据库连接的一个解释。。。