考虑以下数据库:
from sqlalchemy import String, select, create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user_account"
name: Mapped[str] = mapped_column(String(30))
surname: Mapped[str] = mapped_column(String(30))
def __repr__(self):
return f"User(name={self.name!r}, surname={self.surname!r})"
engine = create_engine("sqlite+pysqlite:///test3.sqlite3", echo=True)
Base.metadata.create_all(engine)
with Session(engine) as session:
user1 = User(
name="Mario",
surname="Rossi"
)
user2 = User(
name="Mario",
surname="Bianchi",
)
user3 = User(
name="Giovanni",
surname="Bianchi",
)
session.add_all([user1, user2, user3])
session.commit()
现在假设我有一个想要查找的用户列表:
users = [("Mario", "Rossi"), ("Giovanni", "Bianchi")]
然后我会运行:
names = [name for name, _ in users]
surnames = [surname for _, surname in users]
with Session(engine) as session:
stmt = select(User).where(User.name.in_(names)).where(User.surname.in_(surnames))
print(session.execute(stmt).scalars().all())
返回:
[User(name='Mario', surname='Rossi'), User(name='Mario', surname='Bianchi'), User(name='Giovanni', surname='Bianchi')]
但“Mario Bianchi”不在我的输入用户列表中。
我如何连接 IN 语句以便仅选择成对对应关系?
也就是说,如果我有varA in (el1, el2) AND varB IN (el3, el4)
,我不想选择带有varA==el1 AND varB==el4