sqlalchemy 联表查询的例子
时间: 2024-01-07 12:06:08 浏览: 26
假设我们有两个表格,一个是 `users` 表格,包含用户的信息,如下所示:
```
users
+----+----------+-------------+
| id | username | email |
+----+----------+-------------+
| 1 | alice | alice@abc.com|
| 2 | bob | bob@abc.com |
| 3 | charlie | charlie@abc.com|
+----+----------+-------------+
```
还有一个 `orders` 表格,包含用户的订单信息,如下所示:
```
orders
+----+---------+------------+-------+
| id | user_id | order_date | total |
+----+---------+------------+-------+
| 1 | 1 | 2020-01-01 | 50.00 |
| 2 | 2 | 2020-01-02 | 100.00 |
| 3 | 1 | 2020-01-03 | 75.00 |
+----+---------+------------+-------+
```
我们可以使用 SQLALchemy 的 `join()` 方法来联表查询,如下所示:
```python
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Float
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# 定义 User 和 Order 模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String)
email = Column(String)
orders = relationship('Order', backref='user')
class Order(Base):
__tablename__ = 'orders'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
order_date = Column(String)
total = Column(Float)
# 创建数据库连接
engine = create_engine('mysql://user:password@host:port/dbname', echo=True)
# 创建表
Base.metadata.create_all(engine)
# 创建 Session
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
# 联表查询
result = session.query(User.username, Order.order_date, Order.total).join(Order).all()
# 打印结果
for row in result:
print(row)
```
运行结果为:
```
('alice', '2020-01-01', 50.0)
('bob', '2020-01-02', 100.0)
('alice', '2020-01-03', 75.0)
```
这个例子中,我们定义了 `User` 和 `Order` 两个模型,使用 `relationship()` 和 `backref` 来建立关系。在查询时,我们使用 `join()` 方法来联表查询,然后使用 `all()` 方法获取所有结果。最后,我们遍历结果,将每行打印出来。