【问题标题】:How to use wild cards in SQLAlchemy? [duplicate]如何在 SQLAlchemy 中使用通配符? [复制]
【发布时间】:2020-01-22 04:49:31
【问题描述】:

我正在尝试使用通配符进行使用 SQLAlchemy 的查询,但我得到的是一个空列表。

我的代码:

engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
s = input("Search for a book: ")
q = db.execute(f"SELECT * FROM books WHERE isbn LIKE '%\:s\%' OR author LIKE '%\:s\%' OR title LIKE '%\:s\%'", {"s": s}).fetchall()

我正在使用\ 转义在函数使用占位符变量的值时插入的引号,如果我删除它们,我会收到此错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "grey"
LINE 1: SELECT * FROM books WHERE isbn LIKE '%'grey'%' OR author LIK...

在 SQLAlchemy 中是否可以使用通配符?

我可以通过使用格式化字符串而不是变量的占位符来完成这项工作,但这会使我的代码容易受到 SQL 注入的攻击。 我也在使用 PostgreSQL。

【问题讨论】:

  • 为什么要转义自己的参数,而这是参数化查询的重点?
  • 我试图转义占位符变量插入的引号。

标签: python sql sqlalchemy wildcard


【解决方案1】:

% 字符应该是您传入的参数的一部分,而不是模板字符串,并且您不应该手动添加引号。让 SQLAlchemy 为你做这件事。

此外,模板不需要是 f 字符串。

例如:

s = input("Search for a book: ")
q = db.execute(
    "SELECT * FROM books WHERE isbn LIKE :s OR author LIKE :s OR title LIKE :s",
    {"s": "%" + s + "%"},
).fetchall()

【讨论】:

  • 我试过了,它仍然返回一个空列表...
  • 那么你的谓词不匹配,或者表为空。请注意,LIKE 区分大小写(在 Postgresql 中)。此外,为了使用命名占位符,如果直接使用 EngineConnection 而不是 Session,则必须将查询包装在 text() 构造中。
  • 哦,我忘了让搜索不区分大小写!我只是使用 ILIKE 而不是 LIKE。非常感谢您的帮助!
猜你喜欢
  • 2018-09-22
  • 2013-01-16
  • 2014-04-06
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2013-03-17
相关资源
最近更新 更多