📜  在 SQLAlchemy 中查询和选择特定列(1)

📅  最后修改于: 2023-12-03 15:23:19.756000             🧑  作者: Mango

在 SQLAlchemy 中查询和选择特定列

在 SQLAlchemy 中,使用查询语句可以从数据库中获取所需数据。在某些情况下,可能只需要获取表中的某些列,而不是所有列的数据。

以下是在 SQLAlchemy 中查询和选择特定列的方法。

1. 使用 Query 对象

使用 Query 对象可以选择要检索的列。可以使用 query() 方法选择所需的列。例如:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///example.db', echo=True)

Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

Base.metadata.create_all(engine)

# 查询所有用户的名字
users_names = session.query(User.name).all()

# 查询用户ID和名字
users_data = session.query(User.id, User.name).all()

print(users_names)
print(users_data)

输出为:

[('Alice',), ('Bob',), ('Charlie',)]
[(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]

在第一个示例中,我们只选择了用户表中的名字列,所以只返回了所有用户的名字。

在第二个示例中,我们选择了用户表中的 ID 和名字列,因此返回了每个用户的 ID 和名字。

2. 使用 select 函数

可以使用 SQLAlchemy 的 select 函数来选择要从表中检索的列。例如:

from sqlalchemy import select, create_engine, Table, Column, Integer, String

engine = create_engine('sqlite:///example.db', echo=True)

metadata = Base.metadata

users = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('age', Integer),
)

# 查询所有用户的名字
stmt = select(users.columns.name)
result = engine.execute(stmt).fetchall()
print(result)

# 查询用户ID和名字
stmt = select([users.columns.id, users.columns.name])
result = engine.execute(stmt).fetchall()
print(result)

输出为:

[('Alice',), ('Bob',), ('Charlie',)]
[(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]

在第一个示例中,我们选择了用户表中的名字列,因此只返回了所有用户的名字。

在第二个示例中,我们选择了用户表中的 ID 和名字列,因此返回了每个用户的 ID 和名字。

3. 使用 with_entities 方法

我们还可以使用 Query 对象的 with_entities 方法选择要从表中检索的列。例如:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///example.db', echo=True)

Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

Base.metadata.create_all(engine)

# 查询所有用户的名字
users_names = session.query(User).with_entities(User.name).all()

# 查询用户ID和名字
users_data = session.query(User).with_entities(User.id, User.name).all()

print(users_names)
print(users_data)

输出为:

[('Alice',), ('Bob',), ('Charlie',)]
[(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]

在这里,我们使用 with_entities 方法选择了所需的列。

尽管这可以与 query() 方法的效果相同,但 with_entities 更适合仅选择列的情况,而 query() 更适合限制结果集的多个条件和连接的情况。

以上是在 SQLAlchemy 中查询和选择特定列的方法。