[解決済み] Flask で SQLAlchemy を使ってデータベース関数を呼び出すには?
質問
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()
関連
-
Python関数の高度な応用を解説
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Flask-SQLAlchemyでidでレコードを削除する方法
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] Flaskで静的ファイルを提供する方法
-
[解決済み】Flask-SQLAlchemyアプリで生のSQLを実行する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
Python カメの描画コマンドとその例
-
PythonはWordの読み書きの変更操作を実装している
-
Pythonによるjieba分割ライブラリ
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない