【问题标题】:How can I write a delete postgresql query in Python flask如何在 Python 烧瓶中编写删除 postgresql 查询
【发布时间】:2020-03-27 15:58:05
【问题描述】:

我试图使用flask和postgresql从数据库表中删除,但我的mysql语法一直出错。请问我该如何实现它。下面的两种方法都不起作用。注意:ID 将从变量中检索。我实际上是 php 的 python 新手。

my_id = 3
del = engine.execute("DELETE FROM my_table WHERE id = '{my_id}'")
del = engine.execute("DELETE FROM my_table WHERE id=:id", {"id":my_id})

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    SQLAlchemy 1.x

    你可以这样做:

    my_id = 3
    result = engine.execute("DELETE FROM my_table WHERE id = %s", my_id)
    

    result = engine.execute("DELETE FROM my_table WHERE id = %(id)s", {'id': my_id})
    

    在这两个语句中,您都假设底层数据库连接库(例如 psycopg2 或 pg8000)正在使用 %-formatting 来绑定查询参数。为了避免这种依赖,您可以使用sqlalchemy.text 来构建查询字符串:

    import sqlalchemy as sa
    result = engine.execute(sa.text("DELETE FROM my_table WHERE id = :id"), id=my_id)
    

    让 sqlalchemy 构建查询并处理参数绑定和引用。

    你应该使用普通的python字符串格式化函数来绑定查询参数:

    engine.execute("DELETE FROM my_table WHERE id = %s" % my_id)
    engine.execute("DELETE FROM my_table WHERE id = {}".format(my_id))
    engine.execute(f"DELETE FROM my_table WHERE id = {my_id}")
    

    使用这些方法可能会使您的应用程序遭受 SQL 注入攻击,因为查询参数可能没有被正确引用。 风格要点:不能使用del 作为变量名。 Python 已经有了del statement,尝试重新分配名称del 会导致SyntaxError。此外,DELETE 语句返回的 ResultProxy 对象不包含任何行,因此将结果分配给变量没有什么意义。

    SQLAlchemy 2.0

    在 SQLAlchemy 2.0(仍在开发中)或在引擎的 future 标志设置为 True 的 SQLAlchemy 1.4 中,无法再直接执行原始 SQL 字符串*,也不能使用隐式连接如engine.execute

    原始 SQL 语句必须由 sqlalchemy.text 包装,参数作为字典传递,因此代码如下所示:

    with engine.begin() as conn:
        conn.execute(sa.text('DELETE FROM my_table WHERE id = :id'), {'id': my_id})
    

    面向对象的风格

    不管你使用的是什么版本,你都可以操作Table对象来删除行

    # Reflect an existing table from the database.
    tbl = sa.Table('my_table', sa.MetaData(), autoload_with=engine)
    
    with engine.begin() as conn:
        conn.execute(tbl.delete().where(tbl.c.id == my_id))
        conn.execute(sa.delete(tbl).where(tbl.c.id == my_other_id))
    

    * 如果你真的必须的话,你仍然可以使用Connection.exec_driver_sql 执行原始 SQL。

    【讨论】:

      【解决方案2】:

      有几种方法可以在 python 中构建字符串,如果你使用的是 python3,那么我会使用 f-strings,你的第二行代码几乎正在使用它。你只需要在你的引号前添加一个“f”,你的代码就变成了:

      del = engine.execute(f"DELETE FROM my_table WHERE id = '{my_id}'")
      

      这里有一些关于在 python 中格式化字符串和使用 f-strings https://realpython.com/python-f-strings/的信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 2014-07-20
        • 2015-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多