SQLAlchemy Query 只比较特定点之前的字符串

SQLAlchemy Query only compares strings up to a certain point

上下文:

我正在 python 中编写 API,我在其中使用令牌进行身份验证。

Table定义

class UserSessionModel(Base):
    __tablename__ = "user_session"

    id = Column(Integer, primary_key=True, nullable=False)
    user_id = Column(Integer, ForeignKey(UserModel.id), nullable=False)
    token = Column(String(300), nullable=False)
    login_date = Column(DateTime, nullable=False)
    logout_date = Column(DateTime)
    expire_date = Column(DateTime, nullable=False)

问题:

这些标记往往很长(远超过 100 个字符)。将其存储到数据库中没有问题,使用简单的 SELECT 语句取回条目也没有问题

SELECT * FROM user_session WHERE user_session.token = {token};

使用SQLAlchemy 查询时出现问题。代码如下所示:

response = self.database_session.query(UserSessionModel).filter(token == token).all()

当我现在在数据库中有非常相似的标记时,如下两个:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoic3RyaW5nIiwidGltZXN0YW1wIjoiMjAyMi0wNS0wNyAxNTo1MDoyMy44MzAxMzEifQ.o0m4LjOb4Jq_z5Y3jQeG7I15_smtY-hVSo2fQpkxM94

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoic3RyaW5nIiwidGltZXN0YW1wIjoiMjAyMi0wNS0wNyAxNTo1MTo0OS44NjY1MzYifQ.fOODf6wXCyhN9OyLW1mSzKhZk1-5XIGNdbN57vaeN2c

代码 return 包含这两个条目,尽管我只搜索其中一个条目。我怀疑查询只比较字符串到某个点。

问题:

有没有办法确保 SQLAlchemy 查询将字符串与末尾进行比较,然后在上面的示例中只 return 一个条目?

您的 .filter() 似乎无效。 token == token 将始终为真,因此您的过滤器将 return 所有行。

.filter(UserSessionModel.token == token) 应该有效,但请注意 session.query().filter() 在 SQLAlchemy 1.4+ 中被认为是遗留的,因此首选的咒语是

token =  "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoic3RyaW5nIiwidGltZXN0YW1wIjoiMjAyMi0wNS0wNyAxNTo1MDoyMy44MzAxMzEifQ.o0m4LjOb4Jq_z5Y3jQeG7I15_smtY-hVSo2fQpkxM94"
results = database_session.scalars(
    select(UserSessionModel).where(UserSessionModel.token == token)
).all()