Задать вопрос
@89109983838

Flask-sqlalchemy как проверить\создать\обновить строки в базе данных?

Доброе время суток!
Столкнулся с такой ситуацией: тестовый проект на Flask, понадобилось сохранить настройки отдельных "модулей" в базе данных, до этого хранились в .txt
и так есть в базе таблица Setting и её модель
class Setting(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    group = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
    key = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
    value = db.Column(db.Text)

алгоритм такой пытаюсь реализовать:
- функция принимает данные из request.form, проверяет их наличие в базе данных ( по group);
- при отсутствии создает поля с данными (group='setting', key='domain', value=request.form['domain'])
- при наличии обновляет значениями (value) из request.form в базе данных
- и возвращает новые (value) обратно на рейдинг в шаблон!

гугление ничего не дало! , чтение оф.док sqlalchemy тоже!!
наверно не туда "рою...."
#......
if request.method == 'POST':
        data = db.session.query(Setting).filter_by(group='setting').first()
        if not data:
            db.session.add_all([Setting(group='setting', key='domain', value=request.form['domain']),
                    Setting(group='setting', key='name', value=request.form['name']),
                    Setting(group='setting', key='title', value=request.form['title']),
                    Setting(group='setting', key='mdescription', value=request.form['mdescription']),
                    Setting(group='setting', key='mkeywords', value=request.form['mkeywords']),
            db.session.commit()
        # .....--- здесь наверно должен быть некий код для обновление строк в базе, ток как написать незнаю чтоб обновить сразу 4 строки в базе :(
        db.session.commit()
        test = db.session.query(Setting).filter_by(group='setting').all()
        return render_template('setting.html', test=test)


И просто напросто:
Как удалять строки, к примеру нужно удалить все строки где group='setting'????

##### Уточнение#######
с удалением понял! большое спасибо!

1) Правильно ли проверяю существование записей, может есть более специфичный вариант (без выгрузки самих данных, нужно же получить только True или False, а не сами данные)
data = db.session.query(Setting).filter_by(group='setting').first()
        if not data:


2) и все таки как обновлять данные в базе данных причем в разных строках? В тестовом примере выше эта часть вообще упущена! .... или с начало нужно отыскать эти записи в базе и уж потом по id уже обновлять каждую отдельно?
  • Вопрос задан
  • 4719 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
@89109983838 Автор вопроса
Вот после подбора и разбора параметров и ситуаций - результат такой:
(буду признателен если кто добавит в комментариях правки по оптимизации)
есть у нас форма с полями на типа:
<input name=domain type="text" value="{{ data.domain }}">
<input name=name type="text" value="{{data.name}}">
.......... и так далее..... вьюшка получилась универсальна - 
можно хоть сотни input добавлять прямо в шаблоне, 
главное чтоб имена были у всех разные


теперь сама вьюшка проверяет наличие input - он существует в базе то обновляет его значение - если нет еще то создает с присланными параметрами.

app.route('/setting/', methods=['GET', 'POST', 'DELETE'])
def setting():
    if not session.get('logged_in'): # проверяем залогин ли usr
        abort(404)                        
    if request.method == 'DELETE':  # Если метод HTTP = DELETE удаляем настройки для группы setting
        db.session.query(Setting).filter_by(group='setting').delete() 
        db.session.commit()
        return render_template('setting.html')
    data = {} #создаем словарь - в нем собираем данные и отправляем обратно в форму (так как разложить data = db.session.query(Setting).all() в шаблоне без переборов у меня не хватило ума... :(  , а так по-моему проще )
    if request.method == 'POST':
        for i in request.form.keys(): # обрабатываем каждый input по отдельности
            u = db.session.query(Setting).filter_by(group='setting').filter_by(key=i).first()
            if u: # если существует обновляем значением из form
                u.value = request.form[i]                 
                data[i] = request.form[i] # добавляем в словарь
            else:
                db.session.add(Setting(group='setting', key=i, value=request.form[i])) # в противном случае создаем новое поле в базе данных и добавляем обратно в словарь
                data[i] = request.form[i]
        db.session.commit() # Записать изменения в Базу данных
        return render_template('root/setting.html', data=data)  # как видите словарь ушел обратно к темплею, в указном выше примере показано как словарь раскладывается....
    u = db.session.query(Setting).filter_by(group='setting').all()   # Ну а пи простом GET запросе выгружаем все записи по группе, создаем словарь и отправляем на рендринг
    for i in u:        
        data[i.key]=i.value
    return render_template('root/setting.html', data=data)


В результате:
надо мне добавить в базу строку для хранения настройки какого-нибудь модуля
- я добавляю соответственно только в теплее очередной input в его группу
- и он сразу работает!!!!!

Кстати таблица выглядит в models.py так:
class Setting(db.Model):
    id = db.Column(db.Integer,primary_key = True)
    group = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
    key = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
    value = db.Column(db.Text, index = True)
    
    def get_id(self):
        return self.id
        
    def __unicode__(self):
        return self.id
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
Как удалять строки, к примеру нужно удалить все строки где group='setting'?


docs.sqlalchemy.org/en/latest/orm/query.html#sqlal...
db.session.query(Setting).filter_by(group='setting').delete()
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы