如何在Flask-SQLAlchemy应用中执行原始SQL

22 浏览
0 Comments

如何在Flask-SQLAlchemy应用中执行原始SQL

在SQLAlchemy中如何执行原始的SQL语句?

我有一个运行在Flask上的Python web应用,通过SQLAlchemy与数据库进行交互。

我需要一种运行原始SQL的方法。这个查询涉及多个表的连接以及内联视图。

我尝试过:

connection = db.session.connection()
connection.execute(  )

但是我一直收到网关错误。

0
0 Comments

如何在Flask-SQLAlchemy应用程序中执行原始SQL查询

在Flask-SQLAlchemy应用程序中,使用SQLAlchemy会话对象的execute方法可以执行原始的SQL查询。无论查询是原始的SQL还是其他类型的查询,都应该通过会话对象进行。这样可以确保查询由事务管理,允许在同一请求中的多个查询作为一个单元进行提交或回滚。如果使用引擎或连接来执行查询,将会增加出现难以检测的错误导致数据损坏的风险。每个请求应该关联一个事务,使用db.session可以确保这一点。

需要注意的是,execute方法设计用于参数化查询。为了防止SQL注入攻击,应该使用参数,例如上面示例中的:val。可以通过将字典作为第二个参数传递来为这些参数提供值,其中每个键是查询中参数的名称。参数的确切语法可能因数据库而异,但所有主要的关系数据库都以某种形式支持参数化查询。

假设查询是SELECT查询,这将返回一个可迭代的RowProxy对象。可以使用多种技术访问单个列,例如通过位置索引或列名。个人偏好将结果转换为命名元组(namedtuple)。

如果没有使用Flask-SQLAlchemy扩展,仍然可以轻松使用会话。需要导入SQLAlchemy和sessionmaker、scoped_session等类。可以创建一个引擎并绑定到会话中,然后执行原始的SQL查询。

需要注意的是,在执行完查询后应该关闭会话,例如使用db.session.close()方法。关闭会话后仍然可以享受连接池的好处。

需要注意的是,在某些版本的SQLAlchemy和Flask-SQLAlchemy中,使用dict(r.items())可能会出现问题,可以尝试使用较早的版本来解决这个问题。

总结起来,可以通过SQLAlchemy会话对象的execute方法执行原始的SQL查询,使用参数化查询可以防止SQL注入攻击。查询结果可以通过各种技术访问,包括位置索引、列名和命名元组。如果没有使用Flask-SQLAlchemy扩展,仍然可以使用会话来执行原始的SQL查询,并在执行完查询后关闭会话。

0
0 Comments

问题的出现原因:用户想要在Flask-SQLAlchemy应用程序中执行原始的SQL查询,以获取SELECT查询的结果。

解决方法:

1. 使用from_statement()text()方法来执行原始的SQL查询。具体用法可以参考这里的示例。

2. 通过创建一个text()对象,并将原始的SQL查询作为参数传递给from_statement()方法,然后使用params()方法来设置查询参数。

3. 使用all()方法来获取查询结果,并将结果返回。

下面是一个示例代码,演示了如何执行原始的SQL查询并获取结果:

from sqlalchemy.sql import text
user = session.query(User).from_statement(
    text("""SELECT * FROM users where name=:name""")
).params(name="ed").all()
return user

用户对此解决方法表示赞赏,并称其为一个救星。

0
0 Comments

在Flask-SQLAlchemy应用中执行原始SQL的问题的原因是使用的方法已经过时,需要找到替代方法。解决方法是使用新的方法来执行原始SQL并提交事务。

解决方法就是使用新方法来执行原始SQL并提交事务。在Flask-SQLAlchemy中,可以使用以下方法来执行原始SQL并提交事务:

result = db.engine.execute("<sql here>")

或者:

from sqlalchemy import text
sql = text('select name from penguins')
result = db.engine.execute(sql)
names = [row[0] for row in result]
print names

需要注意的是,db.engine.execute()方法已经过时,不推荐在SQLAlchemy 2.0中使用。如果要执行插入或更新操作,需要手动提交事务。在使用原始SQL时,需要自己发出BEGINCOMMIT语句。

如果在不使用SQLAlchemy的情况下发出相同的SQL命令,是否有效?可以启用数据库的调试模式,以便查看它执行的命令。

有一个用户在stackoverflow上提到了这个问题,他尝试了以上方法但似乎不起作用。他表示在应用程序日志中可以看到结果,也可以在数据库日志中看到结果,但结果并没有提交。他在stackoverflow上提了一个问题,希望能得到更多的帮助。

有其他用户提到使用db.engine.execute(text("<sql here>")).execution_options(autocommit=True))方法可以执行并提交原始SQL。

还有一个用户指出,"如果你使用原始SQL,你可以控制事务,所以你必须自己发出BEGIN和COMMIT语句"是不正确的。你可以使用Session对象来使用原始SQL。

有用户问到为什么需要使用text(...)来包装查询,另一个用户回答说可以在文档中找到答案。

还有用户问到在执行查询后是否需要关闭连接,另一个用户回答说这取决于是否使用了事务。可以参考docs.sqlalchemy.org/en/13/core/…中的示例来使用事务。

最后一个用户指出在SQLalchemy > 2.0中这种方法将不起作用,需要查看stackoverflow上的解决方法。

解决方法是使用新的方法来执行原始SQL并提交事务,同时需要注意在SQLAlchemy 2.0中一些方法已经过时。

0