2016-08-10 69 views
1

我想調用我在PostgreSQL數據庫中創建的函數。我已經看過官方的SQLAlchemy文檔以及這裏的幾個問題,但似乎沒有人解釋如何在SQLAlchemy中設置函數。如何在Flask中使用SQLAlchemy調用數據庫函數?

我確實發現this question,但我不確定如何編譯該函數,正如答案所示。代碼去哪了?當我嘗試將它放入視圖和模型腳本中時出現錯誤。

編輯1(2016年8月11日)

按照社區的要求和需求,這裏都是我離開了細節:

我有一個表叫做書,它的列排列提供關於一般書籍(標題,作者,出版日期......)的信息。

然後我有很多表都是同一種類的列,它們的列包含有關每本書中所有章節(章節名稱,長度,簡短摘要...)的信息。 每本書都有自己的桌子是絕對必要的。我玩過所有章節中的一張大桌子,發現它不適合我的需要,不太講究非常笨拙。

我正在詢問的函數查詢書籍的表格以查找單個書的名稱,並將該書的名稱轉換爲regclass。然後,它查詢regclass對象中的所有數據,將所有行作爲表單返回,然後退出。以下是原始代碼:

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的知道,可以撥打我有我的數據庫中的功能?我也接受其他建議,以達到同樣的結果。

P.S.我只是遺漏了這些信息,目的是讓我的問題儘可能抽象,不知道論壇的規則要求提出一個非常具體的問題。請原諒我缺乏知識。

+0

怎麼樣[文本SQL](HTTP: //docs.sqlalchemy.org/en/latest/core/tutorial.html#using-textual-sql)? – roy

+1

你的功能是做什麼的?你是如何嘗試鏈接的答案?什麼沒有用?請[edit]包含[mcve]。 – davidism

回答

0
from sqlalchemy.sql import text 
with engine.connect() as con: 
    statement = text("""your function""") 
    con.execute(statement) 

您必須通過SQLAlchemy的

2

執行原始的SQL如果你想這樣做,沒有原始的SQL語句,你可以使用func從SQLAlchemy的:

from sqlalchemy import func 

data = db.session.query(func.your_schema.your_function_name()).all() 
相關問題