这个问题类似于SQLAlchemy query where a column contains a substring,但反过来说:我试图查询包含字符串的列,该字符串是另一个给定字符串的子字符串。我怎样才能做到这一点?
以下是使用ORM设置的数据库的代码示例:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import exists
engine = create_engine('sqlite:///:memory:')
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
url = Column(String)
fullname = Column(String)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
session.add_all([
User(url='john', fullname='John Doe'),
User(url='mary', fullname='Mary Contrary')
])
session.commit()
以下作品:
e = session.query(exists().where(User.url == 'john')).scalar()
e
的值为True
。但是,我想做一些像
e = session.query(exists().where(User.url in 'johndoe')).scalar()
其中in
是Python的字符串类型的__contains__
方法。这可能吗?
答案 0 :(得分:3)
它就像(嘿)链接的问题,除了你把它转过来:
SELECT ... WHERE 'johndoe' LIKE '%' || url || '%';
如果你的桌子上有这些字符,你需要注意逃避特殊字符:
SELECT ... WHERE 'johndoe' LIKE '%' || replace(replace(replace(url, '\', '\\'), '%', '\%'), '_', '\_') ESCAPE '\';
在SQLAlchemy中:
escaped_url = func.replace(func.replace(func.replace(User.url, "\\", "\\\\"),
"%", "\\%"),
"_", "\\_")
session.query(... .where(literal("johndoe").like("%" + escaped_url + "%", escape="\\")))
注意Python中的转义反斜杠。
答案 1 :(得分:1)
您可以使用like
e = session.query(exists().where(User.url.like("%{}%".format('put your string here')))).scalar()