与多个数据sqlalchemy flask插入一对多关系

时间:2017-05-23 10:17:46

标签: python mysql flask sqlalchemy

我有两个属于一对多关系的模型。 查询|| ------ o< - Specialneed

我希望能够使用Flask SQLalchemy中构建的关系在Specialneed中插入多个记录。

我可以在Specialneed中插入1条记录,如下所示:

applicationParams={
        'startdate': request.form['startdate'],
        'enddate':  request.form['enddate'],
        'starttime': request.form['starttime'],
        'endtime': request.form['endtime'],
        'budget': request.form['budget'],
        'specialneed': [SpecialNeed(description=request.form['specialNeeds'])]}

但是当我尝试给'specialneed'参数一个表格中输入的特殊内容列表时,它给了我错误:

(pymysql.err.InternalError) (1241, 'Operand should contain 1 column(s)') 
[SQL: 'INSERT INTO specialneed (description, iid) VALUES 
    (%(description)s, %(iid)s)'] [parameters: 
        {'description': ['Speaks English', 'Can sing'], 'iid': 11}]

当我给它一个列表时,它在我的代码中看起来像这样:

applicationParams={
        'startdate': request.form['startdate'],
        'enddate':  request.form['enddate'],
        'starttime': request.form['starttime'],
        'endtime': request.form['endtime'],
        'budget': request.form['budget'],
        'specialneed': [SpecialNeed(description=[sn.strip() for sn in request.form['specialNeeds'].split('.')])]}

sql insert查询应如下所示:

SQL: 'INSERT INTO specialneed (description, iid) VALUES 
(%(description)s, %(iid)s)'] [parameters: 
      {'description': 'Speaks English', 'iid': 11}, 
      {'description': 'Can sing', 'iid': 11}]

我该如何管理呢?

2 个答案:

答案 0 :(得分:1)

模型是

   class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    active = db.Column('is_active', db.Boolean(), nullable=False, server_default='1')
    usermobilenumber = db.Column(db.String(100, collation='NOCASE'), nullable=False, unique=True)
    password = db.Column(db.String(255), nullable=False, server_default='')
    roles = db.relationship('UserRoles')

class UserRoles(db.Model):
    __tablename__ = 'user_roles'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id', ondelete='CASCADE'))
    role_id = db.Column(db.Integer(), db.ForeignKey('roles.id', ondelete='CASCADE'))

通过for循环迭代请求值并追加。

         @app.route('/usercreation', methods=['POST','GET'])
         def usercreation():
           if request.method == 'POST':
             usermobilenumber = request.form['mobilenumber']
             userpassword = request.form['password']

             # roless is a list(many values)
             roless = request.form.getlist('roles')

             user = User(username=usermobilenumber,password = 
                    generate_password_hash(userpassword))

             #append list values into model object
             for r in roless:
               role = UserRoles(role_id=r)
               user.roles.append(role)

             db.session.add(user)
             db.session.commit()

答案 1 :(得分:0)

我通过朋友找到了答案。 如果我改变这一部分:

'specialneed': [SpecialNeed(description=[sn.strip() for sn in request.form['specialNeeds'].split('.')])]

对此:

'specialneed': [SpecialNeed(description=sn.strip()) for sn in reuqest.form['specialNeeds'].split(".")]

它会起作用。 有关列表推导的更多信息,请查看this site