小编shi*_*asu的帖子

SQLAlchemy Select 和 Query API 之间的区别

不确定以前是否有人问过这个问题,但在 SQLAlchemy文档中,他们讨论了作为ORMselect()新功能的一部分引入。2.0 style以前(1.x style),该query()方法用于获取数据。这两者有什么区别?

例如,要在Users表中查询包含电子邮件和姓名的用户,我们可以在查询 API 中执行以下操作:

session.query(Users).filter_by(name='name', email='mail@example.com').first()
Run Code Online (Sandbox Code Playgroud)

在 Select API 中,同样会导致更多代码:

from sqlalchemy import select

query = select(Users).filter_by(name='name', email='mail@example.com')
user = session.execute(query).fetchone()
Run Code Online (Sandbox Code Playgroud)

与其他相比,使用其中一种是否有任何显着优势,例如性能提升?2.0 API 仍在积极开发中,但似乎他们的文档更倾向于选择 API,而不是“传统”查询 API。这是否只是试图弥合 ORM 和核心功能之间的差距?

python sql orm sqlalchemy

19
推荐指数
2
解决办法
7245
查看次数

如何为 alembic 迁移配置 pytest

我正在使用 PostgreSQL 数据库和 SQLAlchemy 运行 FastAPI 应用程序。我曾经sessionmaker创建和使用数据库会话,并且有一个需要在数据库上执行的自定义 alembic 迁移脚本。

from app.core.config import DATABASE_URL
from app.models import User, Passwords
from app.db import Base

from alembic import context

config = context.config
config.set_main_option('sqlalchemy.url', DATABASE_URL)


fileConfig(config.config_file_name)


target_metadata = Base.metadata



def run_migrations_offline():
   
    url = config.get_main_option("sqlalchemy.url")
    context.configure(
        url=url,
        target_metadata=target_metadata,
        literal_binds=True,
        dialect_opts={"paramstyle": "named"},
    )

    with context.begin_transaction():
        context.run_migrations()
Run Code Online (Sandbox Code Playgroud)

我希望能够创建一个测试数据库,应用相同的迁移,并在测试后拆除。我已经尝试过以下内容conftest.py

# Apply migrations at beginning and end of testing session
@pytest.fixture(scope="session")
def apply_migrations():
    warnings.filterwarnings("ignore", category=DeprecationWarning)
    environ["TEST"] = "True"
    config = Config("alembic.ini")
    alembic.command.upgrade(config, "head")
    yield
    alembic.command.downgrade(config, "base") …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy pytest alembic fastapi

7
推荐指数
1
解决办法
6785
查看次数

我可以覆盖 Pydantic 父模型中的字段以使其可选吗?

我有两个像这样的 pydantic 课程。

class Parent(BaseModel):
    id: int
    name: str
    email: str

class ParentUpdate(BaseModel):
    id: Optional[int]
    name: Optional[str]
    email: Optional[str]
Run Code Online (Sandbox Code Playgroud)

这两者实际上是相同的,但Parent该类要求所有字段。我想Parent在 FastAPI 中使用POST 请求正文的类,因此所有字段都应该是必需的。但我想将后者用于 PUT 请求正文,因为用户可以设置选择性字段而其余字段保持不变。我已经查看了必需的可选字段,但它们与我想要做的不符。

如果有一种方法可以继承Parent该类ParentUpdate并修改其中的所有字段ParentOptional减少混乱。此外,类中存在一些验证器Parent,我必须在ParentUpdate类中重写这些验证器,但我也想避免这些验证器。

有没有办法做到这一点?谢谢。

python pydantic fastapi

5
推荐指数
3
解决办法
2793
查看次数

FastAPI swaggerUI 显示嵌套路由两次

我有这样的配置routes/__init__.py

## api/routes/__init__.py
router = APIRouter()
router.include_router(models_router, prefix="/models", tags=["models"])
...
Run Code Online (Sandbox Code Playgroud)

这是main.py包括它们的。

## main.py
from api.routes import router as api_router
def get_app():
    app = FastAPI()
    app.include_router(api_router, prefix = "/api")
    ...

app = get_app() 
Run Code Online (Sandbox Code Playgroud)

现在在模型路由器内我还有两个嵌套路由,如下所示:

## api/routes/models.py
router.include_router(
    fields_router, 
    prefix="/{model_id}/fields", 
    tags=["fields"],
    dependencies=[Depends(pre_model_validation)]
)
router.include_router(
    model_data_router, 
    prefix="/{model_id}/data", 
    tags=["model_data"],
    dependencies=[Depends(pre_model_validation)]
)
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但当我打开本地主机并使用生成的 SwaggerUI 文档时,它会显示类似这样的内容

swagger 用户界面文档:

嵌套端点也出现在/modelsAPI 内部以及它们单独的/fieldsAPI中/model_data。如何隔离嵌套路由,使其在 swagger 文档中显示为单独的 API,但仍保留在 API 内部定义/models

python swagger-ui openapi fastapi

5
推荐指数
1
解决办法
6153
查看次数

为什么 alembic 升级在 pytest 中的测试数据库上不起作用

总的来说,我对测试还很陌生。我使用 postgreSQL 和 SQLAlchemy 作为数据库,使用 FastAPI 后端和 Alembic 进行迁移。我想建立一个测试数据库进行测试。我有要在测试数据库上执行的自定义迁移脚本。这是一个示例test_users文件。

import pytest
import alembic
from alembic.config import Config

from fastapi.testclient import TestClient
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy_utils import create_database, database_exists, drop_database
from sqlalchemy.orm import sessionmaker
`
TEST_DB_URL = f"{DATABASE_URL}_test"

if database_exists(TEST_DB_URL):
    drop_database(TEST_DB_URL)

create_database(TEST_DB_URL)

alembic_cfg = Config("alembic.ini")
alembic_cfg.set_main_option('sqlalchemy.url', str(TEST_DB_URL))
alembic.command.upgrade(alembic_cfg, "head")

engine = create_engine(TEST_DB_URL)
TestingSessionLocal = sessionmaker()


@pytest.fixture(scope='session')
def connection():
    connection = engine.connect()
    yield connection
    connection.close()

@pytest.fixture
def session(connection):
    transaction = connection.begin()
    session = TestingSessionLocal(bind=connection) …
Run Code Online (Sandbox Code Playgroud)

python pytest alembic fastapi

5
推荐指数
1
解决办法
3498
查看次数

Lua随机数生成

我在使用 Lua 中的math.random()函数时遇到问题。我试图运行的代码是:

 for x = 1,5 do
    math.randomseed(os.time())
    math.random(); math.random(); math.random()
    value = math.random(0,9)
    print(value)
end
Run Code Online (Sandbox Code Playgroud)

打印的随机数始终相同。

可能的解决方案是什么?我想要 5 个唯一的随机数。

random lua for-loop

3
推荐指数
1
解决办法
1万
查看次数

Python ABC 接口究竟是如何工作的?

我正在阅读 Luciano Ramalho 写的 Fluent Python 一书,我遇到了以下行:

请注意,内置的具体序列类型实际上并未将所描述的 Sequence 和 MutableSequence 抽象基类 (ABC) 子类化

所以我从 Python 文档中查看了 ABC,但我在理解它们的目的时遇到了问题。

例如,isinstance([], abc.Iterable), 返回True列表,也是如此abc.Sequenceabc.MutableSequence这是有道理的。对于isinstanceissubclass方法,以下内容也是如此。

issubclass(str, abc.MutableSequence) --> False
isinstance((), abc.MutableSequence)  --> False
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:

class A:
    def __iter__(self):
        pass

a = A()
isinstance(a, abc.Iterable) # True
issubclass(A, abc.Iterable) # True
Run Code Online (Sandbox Code Playgroud)

但是 Aabc.Iterable在它的类定义中没有子类化(并且,我假设前面提到的其他类也没有,根据这本书)。这些issubclass / isinstance方法和 ABC 接口在这里是如何工作的?这些函数是否只是在类定义中查找 dunder 方法签名并将它们与上述 ABC 类中的 dunder 签名匹配?

除了提供一种验证类是否包含某些特定的 dunder 方法之外,我看不到 ABC 类的任何目的,因此了解更多有关整个过程的目的会很好。

任何形式的帮助将不胜感激。谢谢。

python inheritance abc python-3.x

0
推荐指数
1
解决办法
35
查看次数

如何在 Vue 3 中将 props 与组件的本地数据进行 2 路绑定?

谁能告诉我如何将组件的 prop 绑定到它自己的数据属性?例如,假设我有一个名为ModalComponent

<template>  // ModalComponent.vue
   <div v-if="showModal">
      ...
      <button @click="showModal = !showModal">close the modal internally</button>
   </div>
</template>

<script>
export default {
  props: {
    show: {
      type: Boolean,
      default: false
    },
  },
  data() {
    return {
      showModal: false,
    }
  }
}
</script>

<style>
</style>
Run Code Online (Sandbox Code Playgroud)

现在考虑我使用此模式作为父组件内部的可重用组件,使用外部按钮打开模式的弹出窗口。

<template>
  <button @click="showChild = !showChild">click to open modal</button>
  <ModalComponent :show="showChild" />
</template>

<script>
export default {
  components: {ModalComponent},
  data() {
    return {
      showChild: false,    
    }
  }
}
</script>

<style>
</style>
Run Code Online (Sandbox Code Playgroud)

如何使每次父母单击按钮时,通过将本地绑定showModal到 prop …

javascript vue.js two-way-binding vue-props vuejs3

0
推荐指数
1
解决办法
3255
查看次数