Flask - TypeError: __init __ () отсутствует 2 обязательных позиционных аргумента: 'name' и 'user_id' - PullRequest
0 голосов
/ 19 октября 2018

Когда я использовал 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"

Ключкод моего operaDB.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()

Проблема возникла после того, как я запустил файл operaDB.py.Я не могу найти решение проблемы.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вам необходимо удалить метод __init__ из ваших моделей, в этом нет необходимости.

Обратите внимание, как мы никогда не определяли метод init в классе User?Это потому, что 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'
>>> 

Лучший способ определить ваши модели показан в документации

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>
0 голосов
/ 19 октября 2018

Когда вы создаете объект в Python, он вызывает метод __init__(), в вашем случае у вас есть 2 аргумента в методе __init__(self, name, user_id), поэтому вы должны предоставить эти 2 значения при создании объекта Env, например env = Env('test01', '1')

Итак, вместо

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

Используйте

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