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()
上下文:
我正在 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()