Данные не сохраняются в базе данных SQLite с несколькими таблицами в Flask с использованием WTForms - PullRequest
0 голосов
/ 14 июля 2020
• 1000 отношения.

Когда я сохраняю данные с помощью формы на веб-странице. Ошибка не появляется, но данные также не сохраняются в таблицах базы данных.

Мои модели

################################################################
##### MODELS CONFIG ###################
################################################################

class dev_inventory(db.Model):

    __tablename__ = 'inventory'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), unique=True, nullable=False)
    host = db.Column(db.String(120), unique=True, nullable=False)
    username = db.Column(db.String(120), nullable=False)
    password = db.Column(db.String(120), nullable=False)
    secret = db.Column(db.String(120), nullable=False)
    type = db.relationship('dev_type', backref='dev_inventory', lazy='dynamic')
    group_name = db.relationship('dev_group', backref='dev_inventory', lazy='dynamic')
    role = db.relationship('dev_role', backref='dev_inventory', lazy='dynamic')

    def __init__(self,name,host,username,password,secret):
        self.name = name
        self.host = host
        self.username = username
        self.password = password
        self.secret = secret

    def __repr__(self):
        return '<Host %r>' % self.host


class dev_group(db.Model):

    __tablename__ = 'groups'

    id = db.Column(db.Integer, primary_key=True)
    group = db.Column(db.String(120), unique=True, nullable=False)
    host_id = db.Column(db.Integer, db.ForeignKey('inventory.id'))

    def __init__(self,group):
        self.group = group


    def __repr__(self):
        return '<Group %r>' % self.group


class dev_role(db.Model):

        __tablename__ = 'roles'

        id = db.Column(db.Integer, primary_key=True)
        role = db.Column(db.String(120), unique=True, nullable=False)
        host_id = db.Column(db.Integer, db.ForeignKey('inventory.id'))

        def __init__(self,role):
            self.role = role


        def __repr__(self):
            return '<Role %r>' % self.role

class dev_type(db.Model):

    __tablename__ = 'types'

    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.String(120), unique=True, nullable=False)
    host_id = db.Column(db.Integer, db.ForeignKey('inventory.id'))

    def __init__(self,type):
        self.type = type


class manage_users(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(120), unique=True, nullable=False)

    def __init__(self,username,password):
        self.username = username
        self.password = password

    def __repr__(self):
        return '<User %r>' % self.user

Сохранение данных во всех других таблицах работает нормально, кроме dev_inventory

I Я использую следующий код формы -

class AddDeviceForm(FlaskForm):


    types_choices = [(type.type) for type in dev_type.query.order_by('type') ]
    group_choices = [(group.group) for group in dev_group.query.order_by('group') ]
    role_choices = [(role.role) for role in dev_role.query.order_by('role') ]

    name = StringField('Devive Name')
    host = StringField('Hostname/IP Address')
    username = StringField('Device Username')
    password = StringField('Device Password')
    secret = StringField('Device Secret')
    type = SelectField('Device Type', choices= types_choices)
    group = SelectField('Device Group', choices=group_choices)
    role = SelectField('Device Role', choices=role_choices)
    submit = SubmitField('Add Device')

Когда я заполняю и сохраняю форму на веб-странице, она не выдает ошибок и ничего не выводит на консоль. хотя он отправляет запрос POST и дает 200 OK, но когда я проверяю БД, данные в этой таблице не сохраняются.

Вот мой код для конкретного представления -

@app.route('/add_device', methods=['GET','POST'])
def add_device():
    form = AddDeviceForm()

    if form.validate_on_submit():
        name = form.name.data
        host = form.host.data
        username = form.username.data
        password = form.password.data
        secret = form.secret.data
        type = form.type.data
        group = form.group.data
        role = form.role.data
        device = dev_inventory(name, host, username, password, secret)
        print(device)
        db.session.add(device)
        db.session.add(type)
        db.session.add(group)
        db.session.add(role)
        db.session.commit()
        return "Device Added Successfully"

    return render_template('add_device.html', form=form)

У меня также есть попытался сохранить все переменные с помощью одной команды 'db.session.add ()', а затем я разбил это дальше, предполагая, что они связаны с разными таблицами, но ни одно из решений не работает.

Любая помощь по этому поводу был бы очень признателен.

1 Ответ

0 голосов
/ 14 июля 2020

Нет необходимости объявлять метод __init__, поскольку вы уже наследуете от db.Model, а db.Model позаботится об инициализации свойств. Я думаю, это проблема, над которой вы боретесь. Итак, удалите методы __init__.

См. Объявление моделей

Кроме того, вы не можете отправить в качестве аргумента данные формы (т.е. form.name.data) в db.session.add ().

См. Вставка записей

    role = form.role.data
    db.session.add(role) # bad

    device = dev_inventory(name, host, username, password, secret)
    db.session.add(device) # good

С другой стороны, помните, что объявление классов должно быть как CamelCase, а не snake_case.

Полная документация Flask -SQLAlchemy

...