【问题标题】:Querying from postgresql server from Python [duplicate]从 Python 的 postgresql 服务器查询 [重复]
【发布时间】:2020-09-15 03:28:21
【问题描述】:

我正在执行这个查询

engine = create_engine(os.getenv("DATABASE_URL")) 
db = scoped_session(sessionmaker(bind=engine))
isbn = 03759
a = db.execute("SELECT * FROM books WHERE idnumber LIKE '%:temp%'", {"temp":isbn}).fetchall()

参考书架的图片: books database

我想查询 idnumber 中包含 03759 但 python 不允许添加前导零的行。我尝试将其转换为字符串并运行查询,但它给了我一个错误,因为有一对额外的引号是这样的:

SELECT * FROM books WHERE idnumber LIKE '%'03759'%'

这就是它被 sqlalchemy 转换的方式。是否有任何解决方法,以便我只能查询 ID 号为 03759 的人?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    可能使用f-string先生成查询字符串,然后在执行命令中使用

    isbn = '03759'
    q = f"SELECT * FROM books WHERE idnumber LIKE '%{isbn}%'"
    a = db.execute(q).fetchall()
    

    编辑:

    我认为 Ilja Everilä 是正确的,如果变量 isbn 来自用户输入,上述代码很容易受到查询注入的影响。要解决此问题,请使用 Ilja Everilä 答案中给出的这个:

    isbn = '03759'
    q = "SELECT * FROM books WHERE idnumber LIKE :isbn"
    q_params = { "isbn": f"%{isbn}%" }
    a = db.execute(text(q), q_params).fetchall()
    

    【讨论】:

    • 谢谢!!!那行得通。
    • 上述漫画传达的是,使用字符串格式将值传递给 SQL 查询会导致注入,更不用说容易出错。这就像使用eval()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2017-02-08
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多