当我使用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:[email protected]: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后发生了问题。我找不到问题的解决方案。
您需要从模型中删除__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>
当你在Python中创建一个对象时,它调用__init__()
方法,在你的情况下你在__init__(self, name, user_id)
方法中有2个参数,所以你应该在创建Env
的env = Env('test01', '1')
对象时提供这两个值
而不是
env = Env()
env.name = 'test01'
env.user_id = '1'
使用
env = Env('test01', '1')