如何使用Flask中的SQLAlchemy调用数据库函数?

2024-06-07 05:39:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想调用我在PostgreSQL数据库中创建的函数。我已经看过官方的SQLAlchemy文档以及这里的几个问题,但是似乎没有人解释如何在SQLAlchemy中设置函数。

我确实找到了this question,但不确定如何按照答案编译函数。密码在哪里?当我试图把这个放在视图和模型脚本中时,会出现错误。

编辑1(8/11/2016)

根据社区的要求和要求,以下是我遗漏的所有细节:

我有一个名为book s的表,其中的列排列有关于一般图书的信息(标题、作者、出版日期…)。

然后我有许多相同类型的表,它们的列包含关于每本书中所有章节的信息(章节名称、长度、简短摘要…)。每本书都有自己的书桌是绝对必要的。我在一个大书桌里翻阅了所有章节,发现它不适合我的需要,更不用说它太笨重了。

我要问的函数是查询图书表中单个图书的名称,并将图书的名称转换为regclass。然后,它查询regclass对象以获取其所有数据,将所有行作为一个表(与各个book表类似)返回,并退出。这是原始代码:

CREATE OR REPLACE FUNCTION public.get_book(bookName character varying)
 RETURNS TABLE(/*columns of individual book table go here*/)
 LANGUAGE plpgsql
AS $function$
declare
    _tbl regclass;
begin
    for _tbl in
        select name::regclass
        from books
        where name=bookName
    loop
        return query execute '
        select * from ' ||_tbl;
    end loop;
end;
$function$

这个函数已经在命令行和pgAdmin中进行了多次测试。它按预期工作。

我的目的是在Flask应用程序中拥有一个路径为@app.route('/book/<string:bookName>')的视图,并在呈现模板之前调用上面的函数。具体情况如下:

@app.route('/book/<string:bookName>')
def book(bookName):
  chapterList = /*call function here*/
  return render_template('book.html', book=bookName, list=chapterList)

这是我的问题:如何设置我的应用程序,使SQLAlchemy知道并可以调用我在数据库中的函数?我也愿意接受实现同样结果的其他建议。

注:我只是为了尽量抽象地保留我的问题而省略了这些信息,并不知道论坛的规则规定了对一个非常具体的问题的要求。请原谅我的无知。


Tags: 函数名称视图信息数据库heresqlalchemyfunction
3条回答
from sqlalchemy.sql import text
with engine.connect() as con:
    statement = text("""your function""")
    con.execute(statement)

必须通过sqlalchemy执行原始sql

你可以使用func

语法:

  from sqlalchemy import func

  func.function_name(column)

示例:

from sqlalchemy import func

result = db.session.query(func.lower(Student.name).all()

如果要在不使用原始sql的情况下执行此操作,可以使用sqlalchemy中的func

from sqlalchemy import func

data = db.session.query(func.your_schema.your_function_name()).all()

相关问题 更多 >