Flask-TypeError:__init __()缺少2个必需的位置参数:“ name”和“ user_id”

时间:2018-10-19 09:12:35

标签: python mysql flask flask-sqlalchemy

当我使用Python插入数据时,出现以下问题:

Traceback (most recent call last):
  File "D:/Documents/python/dbFlask/web/models.py", line 42, in <module>
    env = Env()
TypeError: __init__() missing 2 required positional arguments: 'name' and 'user_id'

我的 init .py如下:

from flask import Flask
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 
"mysql+pymysql://root:123@127.0.0.1:3306/env"

我的operateDB.py的键代码如下:

class Env(db.Model):

    def __init__(self, name, user_id):
        self.name = name
        self.user_id = user_id

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), unique=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
env = Env()
env.name = 'test01'
env.user_id = '1'
db.session.add(env)
db.session.commit()

我运行了operateDB.py之后发生了问题。我找不到解决问题的方法。

2 个答案:

答案 0 :(得分:3)

在Python中创建对象时,它将调用__init__()方法,在您的情况下,您在__init__(self, name, user_id)方法中有2个参数,因此在创建{{1}对象时应提供这2个值}就像Env

所以不是

env = Env('test01', '1')

使用

env = Env()
env.name = 'test01'
env.user_id = '1'

答案 1 :(得分:1)

您需要从模型中删除__init__方法,这是不必要的。

  

请注意我们如何从未在User类上定义 init 方法?这是因为SQLAlchemy向所有模型类添加了一个隐式构造函数,该构造函数为其所有列和关系接受关键字参数。如果出于任何原因决定覆盖构造函数,请确保继续接受** kwargs并使用这些** kwargs调用超级构造函数以保留此行为:

定义了__init__方法后,您将获得一个TypeError

class User(db.Model):
    def __init__(self,name):
        self.name = name

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True)
    env = db.relationship('Env', backref='env')


class Env(db.Model):
    def __init__(self, name, user_id):
        self.name = name
        self.user_id = user_id

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))


>>> from app import *
>>> u1 = User()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'name'
>>> e1 = Env()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'name' and 'user_id'
>>> 

定义模型的最佳方法显示在documentation

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True)
    env = db.relationship('Env', backref='env')


class Env(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

>>> from app import db, User, Env
>>> u1 = User()
>>> u1.name = 'user'
>>> db.session.add(u1)
>>> db.session.commit()
>>> env1 = Env()
>>> env1.name='env'
>>> env1.user_id=u1.id)
>>> db.session.add(env1)
>>> db.session.commit()
>>> env1
<Env 1>