Tortoise ORM复合主键
时间: 2024-06-23 13:02:46 浏览: 527
Tortoise ORM 是一个为 Python 开发的 ORM (Object-Relational Mapping) 库,它提供了将 Python 对象映射到数据库表的工具。在处理复合主键时,复合主键是指由两个或多个字段组成的唯一标识符,这些字段作为一个整体在数据库中作为表的主键。
在 Tortoise ORM 中,你可以定义复合主键的方式如下:
1. **设置模型字段**:在定义你的数据模型时,对于复合主键的字段,使用 `fields=` 参数来指定它们。例如,如果你有一个包含用户 ID 和订单 ID 的复合主键,你会这样定义:
```python
class Order(Model):
user = ForeignKeyField(User, related_name="orders")
order_id = IntegerField()
primary_key = [user, order_id]
```
2. **自动生成外键约束**:Tortoise ORM 会自动处理这些字段之间的关联,确保它们一起构成唯一的键值。
3. **查询操作**:在查询时,你可以根据复合主键的任何一个字段来获取记录,Tortoise ORM 会自动处理其他字段的组合查询。
相关问题
取消Tortoise ORM自动生成主键
Tortoise ORM 是一个为 Python 开发者设计的关系型数据库 ORM,它默认会在创建表的时候自动添加一个主键(通常是 `id` 或类似的字段)。如果你想取消这个行为,不让 Tornado 自动生成主键,你可以通过配置或在定义模型时指定。
1. **配置文件修改**:
在你的 Tortoise ORM 配置文件(如 `pydantic TortoiseConfig` 或 `settings.py`)中,你可以设置 `generate_schemas` 为 `False`,这样在建表时不会自动添加主键。例如:
```python
from tortoise import TortoiseConfig
config = TortoiseConfig(
generate_schemas=False, # 关闭自动创建模式
models_path='models', # 模型文件夹路径
)
```
2. **模型类定义**:
在你的模型类定义中,你可以明确地声明不使用自动主键,比如使用 `fields.IntField(null=True)` 来标记主键字段。例如:
```python
from tortoise.fields import IntField, CharField
from tortoise.models import Model
class MyModel(Model):
id = CharField(null=True, generated=False) # 使用自定义标识符
name = CharField()
```
3. **手动创建表**:
如果你不希望 Tornado ORM 自动处理表的创建,也可以在应用启动后手动调用 `tortoise.init_db()` 方法,然后在创建表时指定主键。
记得在实际操作前备份你的数据,因为这可能会影响到你的数据库结构。此外,如果你需要在表中插入数据,你将需要提供自己的主键值。
tortoise orm
### Tortoise ORM 使用指南
#### 安装 Tortoise ORM
为了开始使用 Tortoise ORM,需先通过 pip 进行安装。该库适用于多种数据库引擎,包括 SQLite、PostgreSQL 及 MySQL。
```bash
pip install tortoise-orm
```
对于特定类型的数据库连接,可能还需要额外的驱动包,比如 `aiomysql` 或者 `asyncpg` 来分别支持 MySQL 和 PostgreSQL[^1]。
#### 初始化配置
初始化 Tortoise ORM 通常涉及设置数据库 URL 和定义模型类。下面是一段简单的代码片段来展示如何完成这一过程:
```python
from tortoise import Tortoise, fields, run_async
from tortoise.models import Model
class Tournament(Model):
id = fields.IntField(pk=True)
name = fields.CharField(max_length=255)
async def init():
await Tortoise.init(
db_url='sqlite://db.sqlite3',
modules={'models': ['__main__']}
)
await Tortoise.generate_schemas()
```
这段脚本展示了创建一个名为 `Tournament` 的表结构,并设置了与 SQLite 数据库之间的连接。
#### 创建和查询数据
一旦完成了上述准备工作,则可以轻松执行 CRUD 操作。这里给出了一些基础的例子:
```python
# 添加新记录到 tournament 表中
tournament = await Tournament.create(name="New Tournament")
# 查询所有比赛名称包含 "Tour" 字样的赛事列表
tournaments = await Tournament.filter(name__icontains="Tour").all()
for t in tournaments:
print(t.name)
# 更新某条记录的信息
await Tournament.filter(id=tournament.id).update(name="Updated Name")
# 删除一条或多条符合条件的数据项
deleted_count = await Tournament.filter(name="Old Event").delete()
print(f"{deleted_count} records were deleted.")
```
这些例子覆盖了常见的增删改查操作,同时也体现了 Tortoise ORM 对于异步方法的支持特性[^2]。
#### 关闭连接池
当应用程序结束运行时应当关闭数据库会话:
```python
await Tortoise.close_connections()
```
这一步骤确保资源被正确释放,防止潜在的问题发生。
阅读全文