Flask和PostgreSQL服务器的连接记录

创建环境

# 仮想環境の作成 + activate
$ python -m venv flask_to_postgresql
$ cd flask_to_postgresql/Scripts
$ ./activate

# 必要なパッケージ取得
$ python -m pip install --upgrade pip
$ pip install flask psycopg2-binary

# 環境確認
$ python --version
Python 3.9.13
$ pip list
Package            Version
------------------ -------
click              8.1.3
colorama           0.4.6
Flask              2.2.2
importlib-metadata 5.1.0
itsdangerous       2.1.2
Jinja2             3.1.2
MarkupSafe         2.1.1
pip                22.3.1
psycopg2-binary    2.9.5
setuptools         58.1.0
Werkzeug           2.2.2
zipp               3.11.0

psycopg2-binary是用于连接PostgreSQL服务器的软件包。

请参考以下网站。

    FlaskからPostgreSQLを使用 via 高本技術士事務所

轨迹

from flask import Flask, render_template
import psycopg2
import psycopg2.extras

# Flask作成
app = Flask(__name__)

# ~/ にアクセスした際に表示するもの
@app.route('/')
def index():
    """_summary_
    従業員リストを表示
    """
    # PostgreSQL Serverとの接続を定義
    conn = psycopg2.connect(
        host='localhost',
        port=5432,
        database='test',
        user='testuser',
        password='testpassword',
    )

    # PostgreSQL Serverと接続を作成
    cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
    # SQLを投入して情報取得
    cur.execute('select * from employee order by employee_id')
    # 結果を取得
    employee_list = cur.fetchall()
    # 接続終了
    conn.close()

    # データをhtmlに渡して表示
    return render_template(
        'flask_to_postgresql.html',
        title='Flask PostgreSQL',
        dataset=employee_list
    )

if __name__ == '__main__':
    # デバッグ出力を有効化
    app.debug = True
    # appを実行(ループバックアドレス + 80番ポート)
    app.run(host='127.0.0.1', port=80)
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>{{ title }}</title>
    </head>
    <body>
        <h2>社員一覧</h2>
        <ul>
            {% for line in dataset %}
            <li>{{ line.employee_id }} : {{ line.name }} : {{ line.abbreviation }}</li>
            {% endfor %}
        </ul>
    </body>
</html>

用语备忘录

    • cursor とは – わわわ

 

    fetch とは – わわわ

理解笔记

psycopg2の使い方の順序は以下

DBの接続情報を作る(conn = psycopg2.connect(~)
DBに接続する
SQLを投入する
結果を取得する
コネクションを閉じる
取得した結果を処理する

psycopg2.extras.DictCursorとは

Python psycopg2 で dict形式で結果を取得する

psycopg2 でよくやる操作まとめ

オシャレなwithを使った記載もある
「実行結果を辞書形式で取得する」らしい

テンプレートに渡す際のdataset=employee_list

datasetは定型句ではなく何でも良い

.html側は上記で指定された変数に対して操作できる

以字典形式获取执行结果

import psycopg2
import psycopg2.extras

def main():
    """_summary_
    社員リストを表示
    """
    # PostgreSQL Serverとの接続を定義
    conn = psycopg2.connect(
        host='localhost',
        port=5432,
        database='srvrec',
        user='srvrec',
        password='vorpoc-2020-srvrec',
    )

    # PostgreSQL Serverと接続を作成
    cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
    # SQLを投入して情報取得
    cur.execute('select * from employee order by employee_id')
    # 結果を取得
    row = cur.fetchall()
    print(row)

    # PostgreSQL Serverと接続を作成
    cur = conn.cursor()
    # SQLを投入して情報取得
    cur.execute('select * from employee order by employee_id')
    # 結果を取得
    bow = cur.fetchall()
    print(bow)
    # 接続終了
    conn.close()

if __name__ == '__main__':
    main()

看一下指定的行(dict指定的row)与不指定的列(无指定的bow)的输出差异。

$ python ./dict_what.py
[['100001', '北条 泰時'], ['100002', '北条 政子'], ['100003', '北条 時房'], ['100004', '三浦 義村']]
[('100001', '北条 泰時'), ('100002', '北条 政子'), ('100003', '北条 時房'), ('100004', '三浦 義村')]
    Pythonの角括弧と丸括弧の違い、丸括弧を使う場合の注意点【()と[]、タプル型とリスト型】

哎呀,我本以为会以{}的方式显示,难道弄错了吗?

import psycopg2
import psycopg2.extras

def main():
    """_summary_
    社員リストを表示
    """
    # PostgreSQL Serverとの接続を定義
    conn = psycopg2.connect(
        host='localhost',
        port=5432,
        database='srvrec',
        user='srvrec',
        password='vorpoc-2020-srvrec',
    )

    # PostgreSQL Serverと接続を作成
    cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
    # SQLを投入して情報取得
    cur.execute('select * from employee order by employee_id')
    # 結果を取得
    row = cur.fetchone()
    print(row)
    print(type(row))

    # PostgreSQL Serverと接続を作成
    cur = conn.cursor()
    # SQLを投入して情報取得
    cur.execute('select * from employee order by employee_id')
    # 結果を取得
    bow = cur.fetchone()
    print(bow)
    print(type(bow))
    # 接続終了
    conn.close()

if __name__ == '__main__':
    main()
$ python .\dict_what.py
['100001', '北条 泰時']
<class 'psycopg2.extras.DictRow'>
('100001', '北条 泰時')
<class 'tuple'>

這本字典型的詞典應該可以適用。這邊看起來更容易使用。

广告
将在 10 秒后关闭
bannerAds