web-dev-qa-db-fra.com

Constructeur de flacon-sqlalchemy

dans le tutoriel du flacon-Sqlalchemy, un constructeur pour le modèle utilisateur est défini:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

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

pour une table avec deux colonnes, cela pourrait être acceptable, mais si j'ai des tables avec plus de 10 colonnes? Les constructeurs ont à définir chaque fois que je définis un nouveau modèle?

27
NightOwl

Dans la plupart des cas, la définition d'un constructeur de votre classe modèle vous donne le comportement correct.

La classe modèle de base de Flack-Sqlalchemy (qui est également la classe de base déclarative de Sqlalchemy) définit un constructeur qui prend juste **kwargs et stocke tous les arguments donnés, de sorte qu'il n'est donc pas nécessaire de définir un constructeur.

Si vous avez besoin de définir un constructeur pour effectuer une initialisation spécifique du modèle, faites-le comme suit:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        # do custom initialization here

En laissant la classe de base gérer le **kwargs Vous vous libérez de la complexité de l'initialisation des champs du modèle.

64
Miguel

Je sais que c'est un peu vieux mais peu importe que cela devrait être utile pour quelqu'un d'autre avec un problème similaire. Si vous rencontrez "TypeError: -init () prend exactement 1 argument (2 donné)" - Cela signifie que vous devez fournir les mots-clés lors de la création des objets à ajouter à votre base de données, comme:

db.session.add(User(username='myname',email='my@email',password='mypassword')).

Il est assez courant de rencontrer ce petit problème ... mais difficile à repérer. J'espère que ça aide.

9
Helen Neely