📅  最后修改于: 2023-12-03 15:05:19.761000             🧑  作者: Mango
SQLAlchemy是一个Python开发的ORM(对象关系映射)工具,提供的API非常强大、完整,是Python中最为流行的ORM框架之一。这里将介绍SQLAlchemy核心中的选择行功能。
SQLAlchemy中,查询时使用 select
函数或 select
方法来获得 Select
对象。其中 select
函数可以从一个基于表达式的角度进行选择。
from sqlalchemy import Table, Column, Integer, String, MetaData
metadata = MetaData()
user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('age', Integer),
Column('address', String),
)
from sqlalchemy import select
stmt = select([user])
from sqlalchemy import create_engine
engine = create_engine('sqlite:///example.db')
conn = engine.connect()
result = conn.execute(stmt)
rows = result.fetchall()
for row in rows:
print(row)
通过上述代码,得到了 result
对象表示结果集。可以使用 fetchone
或 fetchall
两种方法获取一个或所有结果,它们返回的对象是一个元组:
(1, 'Tom', 18, 'Beijing')
(2, 'Jerry', 20, 'Shanghai')
(3, 'Bob', 22, 'Guangzhou')
其中,元组中的每个值分别对应于 select
语句中指定的列。
查询时可以带上条件,例如:
stmt = select([user]).where(user.c.age > 20)
result = conn.execute(stmt)
rows = result.fetchall()
for row in rows:
print(row)
上述代码中,where
子句限制了查询结果中年龄大于 20 的行。
在SQLAlchemy中,可以通过 join
函数对多个表进行联接查询。例如:
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('age', Integer),
Column('address', String),
)
orders = Table('orders', metadata,
Column('id', Integer, primary_key=True),
Column('user_id', Integer, ForeignKey("user.id")),
Column('product', String),
Column('price', Integer)
)
stmt = select([user.c.name, orders.c.product, orders.c.price]).select_from(
user.join(orders, user.c.id == orders.c.user_id)
)
result = conn.execute(stmt)
rows = result.fetchall()
for row in rows:
print(row)
上述代码中,创建了两个表 user
和 orders
,其中 orders
表中的 user_id
列是 user
表的外键。语句中使用 join
函数对两个表进行联接查询,并限制结果集中包含 user.name
、orders.product
和 orders.price
列。
SQLAlchemy提供了强大的选择行功能,支持基于表达式和方法的查询方式。在查询时,可以添加条件或进行连接查询,满足各种复杂查询的需求。