不确定以前是否有人问过这个问题,但在 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 和核心功能之间的差距?
我正在使用 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) 我有两个像这样的 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
并修改其中的所有字段Parent
以Optional
减少混乱。此外,类中存在一些验证器Parent
,我必须在ParentUpdate
类中重写这些验证器,但我也想避免这些验证器。
有没有办法做到这一点?谢谢。
我有这样的配置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 文档时,它会显示类似这样的内容
嵌套端点也出现在/models
API 内部以及它们单独的/fields
API中/model_data
。如何隔离嵌套路由,使其在 swagger 文档中显示为单独的 API,但仍保留在 API 内部定义/models
?
总的来说,我对测试还很陌生。我使用 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) 我在使用 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 个唯一的随机数。
我正在阅读 Luciano Ramalho 写的 Fluent Python 一书,我遇到了以下行:
请注意,内置的具体序列类型实际上并未将所描述的 Sequence 和 MutableSequence 抽象基类 (ABC) 子类化
所以我从 Python 文档中查看了 ABC,但我在理解它们的目的时遇到了问题。
例如,isinstance([], abc.Iterable)
, 返回True
列表,也是如此abc.Sequence
,abc.MutableSequence
这是有道理的。对于isinstance
和issubclass
方法,以下内容也是如此。
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 类的任何目的,因此了解更多有关整个过程的目的会很好。
任何形式的帮助将不胜感激。谢谢。
谁能告诉我如何将组件的 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 …
python ×6
fastapi ×4
alembic ×2
pytest ×2
sqlalchemy ×2
abc ×1
for-loop ×1
inheritance ×1
javascript ×1
lua ×1
openapi ×1
orm ×1
pydantic ×1
python-3.x ×1
random ×1
sql ×1
swagger-ui ×1
vue-props ×1
vue.js ×1
vuejs3 ×1