2017-01-03 4 views
0

Я пытаюсь создать простое веб-приложение Flask, которое запрашивает db postgres и вставляет/удаляет данные. Я даже не уверен в обновлении/вставке, но, как минимум, я просто запрошу db. Я не хочу использовать ORM, потому что это довольно просто. Я хочу использовать psycopg2, так как я использовал его раньше в моем простом приложении python. Теперь я хочу знать, как и когда я должен открыть и закрыть соединение db. Я видел это: http://flask.pocoo.org/docs/0.12/tutorial/dbcon/, но в нем не было ответа.Flask + Postgresql и открытие/закрытие соединения db

ответ

1

http://flask.pocoo.org/docs/0.12/patterns/sqlite3/ обеспечивает лучший пример. Его для sqllite, но все, что отличается, - это то, как устанавливается начальное соединение. Так, где он использует sqllite3, положить psycopg2 звонки в:

import sqlite3 
from flask import g 

DATABASE = '/path/to/database.db' 

@app.before_request 
def get_db(): 
    db = getattr(g, '_database', None) 
    if db is None: 
     db = g._database = sqlite3.connect(DATABASE) 
    return db 

@app.teardown_appcontext 
def close_connection(exception): 
    db = getattr(g, '_database', None) 
    if db is not None: 
     db.close() 

Вы можете найти полностью рабочий пример кода, показывающий использование БД здесь: https://github.com/pallets/flask/blob/master/examples/flaskr/flaskr/flaskr.py. Обратите внимание, что пример установления соединения db вручную по запросу в методах @app.route, тогда как в приведенном выше примере используется крюк @app.before_request, чтобы установить его до вызова методов маршрута.

Вы сказали, что не хотите ОРМ, но вы также можете использовать SQLAlchemy в нерабочем режиме: https://docs.sqlalchemy.org/en/latest/core/tutorial.html. Преимущество этого в том, что существуют конкретные session объекты для управления db connectio: http://flask.pocoo.org/docs/0.12/patterns/sqlalchemy/

+0

где должно быть вызвано 'get_db'? – Jodooomi

+0

Документы предполагают, что вызов должен быть привязан к текущему контексту, который в этом случае является запросом, поэтому для этого должен применяться атрибут '@ app.before_request' метода. Я обновил образец кода. – user783836

+0

Что такое «g», это как объект сеанса, где я могу хранить переменные? – Jodooomi

Смежные вопросы