当前位置: 首页 > 知识库问答 >
问题:

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

戴浩初
2023-03-14

如何在SQLAlchemy中执行原始SQL?

我有一个在flask上运行的python web应用程序,它通过SQLAlchemy与数据库接口

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

我试过:

connection = db.session.connection()
connection.execute( <sql here> )

但我总是会遇到网关错误。

共有3个答案

邓丰
2023-03-14

文档:SQL表达语言教程-使用文本

例子:

from sqlalchemy.sql import text

connection = engine.connect()

# recommended
cmd = 'select * from Employees where EmployeeGroup = :group'
employeeGroup = 'Staff'
employees = connection.execute(text(cmd), group = employeeGroup)

# or - wee more difficult to interpret the command
employeeGroup = 'Staff'
employees = connection.execute(
                  text('select * from Employees where EmployeeGroup = :group'), 
                  group = employeeGroup)

# or - notice the requirement to quote 'Staff'
employees = connection.execute(
                  text("select * from Employees where EmployeeGroup = 'Staff'"))


for employee in employees: logger.debug(employee)
# output
(0, 'Tim', 'Gurra', 'Staff', '991-509-9284')
(1, 'Jim', 'Carey', 'Staff', '832-252-1910')
(2, 'Lee', 'Asher', 'Staff', '897-747-1564')
(3, 'Ben', 'Hayes', 'Staff', '584-255-2631')
阎辰钊
2023-03-14

SQL炼金术会话对象有自己的执行方法:

result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})

所有应用程序查询都应该通过会话对象,无论它们是否是原始SQL。这确保查询由事务正确管理,这允许将同一请求中的多个查询作为一个单元提交或回滚。使用引擎或连接在事务之外会使您面临更大的风险,即难以检测可能会给您留下损坏数据的错误。每个请求应该只与一个事务相关联,使用db.session将确保您的应用程序就是这种情况。

还要注意,execute是为参数化查询而设计的。在示例中,对查询的任何输入使用参数,如:val,以保护自己免受SQL注入攻击。您可以通过传递dict作为第二个参数来提供这些参数的值,其中每个键都是查询中显示的参数名称。参数本身的确切语法可能因数据库而异,但所有主要的关系数据库都以某种形式支持它们。

假设这是一个SELECT查询,它将返回RowProxy对象的iterable。

您可以使用各种技术访问各个列:

for r in result:
    print(r[0]) # Access by positional index
    print(r['my_column']) # Access by column name as a string
    r_dict = dict(r.items()) # convert to dict keyed by column names

就个人而言,我更喜欢将结果转换为namedtuples:

from collections import namedtuple

Record = namedtuple('Record', result.keys())
records = [Record(*r) for r in result.fetchall()]
for r in records:
    print(r.my_column)
    print(r)

如果您没有使用Flask SQLAlchemy扩展,您仍然可以轻松地使用会话:

import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session

engine = sqlalchemy.create_engine('my connection string')
Session = scoped_session(sessionmaker(bind=engine))

s = Session()
result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
汤乐家
2023-03-14

你有没有试过:

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中是不推荐的。

 类似资料:
  • 问题内容: 如何在SQLAlchemy中执行原始SQL? 我有一个在烧瓶上运行的python Web应用程序,并通过SQLAlchemy连接到数据库。 我需要一种运行原始SQL的方法。该查询涉及多个表联接以及内联视图。 我试过了: 但是我不断收到网关错误。 问题答案: 你有没有尝试过: 要么:

  • 我有一个部分扎根的Android设备。所谓部分root,是指我只能通过ADB运行root命令。我已经想出了如何在设备本身的终端模拟器中本地运行这些命令。我的问题是,我将如何着手编写Android应用程序的代码,从按钮按钮执行一个ADB命令(或多个命令)?我找不到任何解释如何通过应用程序界面运行直接ADB命令的东西。只是为了澄清,任何涉及“su”的东西都不会在这个设备上工作。它只接受ADB输入进行根

  • 问题内容: 我正在将旧数据库迁移到我的Rails应用程序(3.2.3)中。原始数据库带有相当多的长SQL查询报表。就目前而言,我想使用Rails应用程序中的sql查询,然后(在时间允许的情况下)将sql查询一一交换为“适当的” Rails查询。 我有一个临床模型,控制器具有以下代码: 但是,当我运行该代码时,会遇到一些与格式有关的错误。 在将它导入控制器之前,我应该对sql查询做些什么?尽管查询可

  • 问题内容: 我正在使用带有实体框架5的asp.net mvc3。我有.edmx文件,并能够使用linq或SP与数据库交互,但是我想运行一些原始sql语句。我正在尝试这样的事情: 是否有可能以这种方式执行sql查询?谢谢。 问题答案: 您可以执行以下类型的查询: 对实体类型的SQL查询,该查询返回特定类型的实体。 { } 非实体类型的SQL查询,该查询返回原始数据类型。 { var studentN

  • 问题内容: 因此,我有一个很小的查询可以在我的数据库上运行,并且在MySQL Workbench中可以正常工作。基本上,再次使用带有左联接的SELECT和带有左联接的UNION。 在尝试将其翻译为Laravel时没有成功。 我遇到了错误 Builder.php 1249行中的ErrorException:未定义的属性:Illuminate \ Database \ Eloquent \ Build

  • 因此,我在数据库上运行了这个小查询,它在MySQL工作台上运行良好。基本上,使用左连接进行选择,然后再次使用左连接进行并集。 年,他试图把它翻译成拉威尔,但没有成功。 我发现了错误 生成器中的错误异常。php第1249行:未定义的属性:Illumb\Database\Eloquent\Builder::$bindings 我如何在Laravel中执行一个完全原始的查询,或者如何在Laravel中以