Dr_Elvis
@Dr_Elvis
В гугле забанен

Правильно ли идет соединение с базой?

Привет!
У меня есть приложение на flask и база Postgres. Использую psycopg2.
Возникли сомнения в правильности работы с базой. Я определил функцию коннекта к базе
def get_db():
    if 'db' not in g:
        g.db = app.config['postgreSQL_pool'].getconn()
    return g.db

далее идут rout`ы, напрмиер:
@app.route('/topsecret/test1')
def test1():
    title = 'Первый тест'
    s = "select * from followers as f left join clanmembers as cm on f.nick = cm.nick left join clans as cl on cm.clanid = cl.clanid order by cl.clanid, f.nick;"
    conn = get_db()
    c = conn.cursor()
    c.execute(s)
    text = c.fetchall()
    c.close()
    s = "select distinct(cl.clanimg), cl.clanid from clans as cl where cl.clanimg is not null order by cl.clanid;"
    conn = get_db()
    c = conn.cursor()
    c.execute(s)
    cli = c.fetchall()
    c.close()
    return render_template('test1.html', title=title, text=text, cli=cli)


@app.route('/topsecret/test2')
def test2():
    title = 'Второй тест'
    s = "select * from uniquemob as u order by u.mobid desc;"
    conn = get_db()
    c = conn.cursor()
    c.execute(s)
    mobs = c.fetchall()
    c.close()
    s = "select * from mobsinlabs as m order by m.name;"
    conn = get_db()
    c = conn.cursor()
    c.execute(s)
    mobsinlabs = c.fetchall()
    c.close()
    return render_template('test2.html', title=title, mobs=mobs, mobsinlabs=mobsinlabs)


@app.route('/test3')
def test3():
    title = 'Третий тест'
    s = "select * from savedress as sd order by sd.date desc limit 20"
    conn = get_db()
    c = conn.cursor()
    c.execute(s)
    sd = c.fetchall()
    c.close()
    return render_template('test3.html', title=title, sd=sd)


Что смущает: я каждый раз обращаюсь к коннекту conn = get_db(), работаю с курсором и потом закрываю соединение c.close()
Правильный ли подход? возможно есть более лучший вариант чтобы меньше напрягать базу.
Так же с таким вариантом если один из запросов долго обрабатывается, то другие страницы думают и не открываются пока не отработает первый скрипт. я так понимаю что параллельно не выполняется, что странно. Плюс у меня SocketIO постоянно получает данные и по той же схеме в базу инсертит, апдейтит и селектит данные.
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
@bacon
показательно плохой код и неправильный подход:
1. много копипасты
2. раз столько повторений, можно уже было придумать не get_db, а какую-нибудь условную функцию "from_execute", которая принимает запрос и возвращает данные
3. orm не зря же придумали, что бы люди меньше писали подобный ужос
4. повторюсь про orm, psycopg2 это низкий уровень, даже в фласке не принято с ним работать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы