1. ホーム
  2. python

[解決済み] Flask で SQLAlchemy を使ってデータベース関数を呼び出すには?

2022-02-25 21:33:58

質問

PostgreSQLのデータベースで作成した関数を呼び出したいのですが、どうすればいいですか?SQLAlchemy の公式ドキュメントを見たり、SO にあるいくつかの質問を見たりしましたが、誰も SQLAlchemy で関数を設定する方法を説明していないようです。

確かに この質問 しかし、回答が示すように、この関数をどのようにコンパイルすればよいのかわかりません。そのコードはどこに行くのでしょうか?これをビュースクリプトとモデルスクリプトの両方に入れようとすると、エラーが発生します。

編集1(2016/8/11)

コミュニティの要望と要件に従って、ここに私が残したすべての詳細を示します。

booksというテーブルがあり、そのカラムには一般的な書籍に関する情報(タイトル、著者、出版日...)が配置されています。

さらに、同じ種類のテーブルが多数あり、そのカラムには各書籍のすべての章に関する情報(章名、長さ、短い要約...)が含まれています。 各書籍が独自のテーブルを持つことが絶対に必要です。 私は、すべての章を1つの大きな表にして遊んでみたことがありますが、私のニーズには合わないことがわかりましたし、言うまでもなく、非常に扱いにくいものでした。

私が質問している関数は、本のテーブルに個々の本の名前を照会し、本の名前を 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. 私は、私の質問をできるだけ抽象的にするつもりで、この情報を省略しただけで、フォーラムの規則が非常に具体的な質問のための要件を指示していることを知りませんでした。私の知識不足をお許しください。

解決方法を教えてください。

生のsqlを使わずにやりたい場合は func を sqlalchemy から取得しました。

from sqlalchemy import func

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