【进阶】使用SQLAlchemy定义模型
发布时间: 2024-06-27 10:50:11 阅读量: 67 订阅数: 121
![【进阶】使用SQLAlchemy定义模型](https://images.ctfassets.net/23aumh6u8s0i/3n0YP76FgDncQCjCcNpj8y/7d8b894146ceb3e54df60555e6c7f5c9/class_diagram_tuto)
# 2.1.1 一对一关系
一对一关系表示两个实体之间存在唯一关联。在 SQLAlchemy 中,一对一关系可以通过 `OneToOne` 关系来实现。`OneToOne` 关系指定了一个实体与另一个实体最多有一个关联。
```python
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
address = Column(String(100))
# 建立一对一关系
User.address = relationship("Address", backref="user", uselist=False)
```
在这个例子中,`User` 和 `Address` 实体之间建立了一对一关系。每个 `User` 最多只能有一个 `Address`,而每个 `Address` 也只能属于一个 `User`。
# 2. SQLAlchemy模型高级特性
### 2.1 关系映射
关系映射是SQLAlchemy中一个重要的特性,它允许我们定义模型之间的关系。SQLAlchemy支持多种关系类型,包括一对一、一对多和多对多关系。
#### 2.1.1 一对一关系
一对一关系表示两个模型之间存在一个一对一的对应关系。例如,我们可以定义一个`User`模型和一个`Address`模型,其中每个用户都有一个唯一的地址。
```python
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
street = db.Column(db.String(120))
city = db.Column(db.String(80))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user = db.relationship("User", backref="address")
```
在上面的示例中,`User`模型和`Address`模型通过`user_id`外键列关联。这意味着每个`User`对象都可以访问其关联的`Address`对象,而每个`Address`对象也可以访问其关联的`User`对象。
#### 2.1.2 一对多关系
一对多关系表示一个模型可以与多个另一个模型相关联。例如,我们可以定义一个`Order`模型和一个`OrderItem`模型,其中每个订单可以包含多个订单项。
```python
class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
customer_id = db.Column(db.Integer, db.ForeignKey('customer.id'))
customer = db.relationship("Customer", backref="orders")
class OrderItem(db.Model):
id = db.Column(db.Integer, primary_key=True)
order_id = db.Column(db.Integer, db.ForeignKey('order.id'))
product_id = db.Column(db.Integer, db.ForeignKey('product.id'))
order = db.relationship("Order", backref="order_items")
product = db.relationship("Product", backref="order_items")
```
在上面的示例中,`Order`模型和`OrderItem`模型通过`order_id`外键列关联。这意味着每个`Order`对象都可以访问其关联的`OrderItem`对象列表,而每个`OrderItem`对象也可以访问其关联的`Order`对象。
#### 2.1.3 多对多关系
多对多关系表示两个模型都可以与多个另一个模型相关联。例如,我们可以定义一个`User`模型和一个`Group`模型,其中每个用户可以属于多个组,而每个组也可以包含多个用户。
```python
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
class Group(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
user_group_table = db.Table('user_group',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('group_id', db.Integer, db.ForeignKey('group.id'))
)
User.groups = db.relationship("Group", secondary=user_group_table, backref="users")
Group.users = db.relationship("User", secondary=user_group_table, backref="groups")
```
在上面的示例中,`User`模型和`Group`模型通过`user_group`关联表关联。这意味着每个`User`对象都可以访问其关联的`Group`对象列表,而每个`Group`对象也可以访问其关联的`User`对象列表。
# 3. SQLAlchemy模型实践应用
### 3.1 用户管理系统
#### 3.1.1 用户模型设计
在用户管理系统中,用
0
0