2012-03-12 3 views
14

table mappée existante Quand j'ai essayé d'ajouter une nouvelle table à python/flacon -classe ne dispose pas d'une table ou tablename spécifiés et ne hérite d'une classe

class UserRemap(db.Model): 
    name = db.Column(db.String(40)) 
    email = db.Column(db.String(255)) 
    password = db.Column(db.String(64)) 
    flag = db.Column(db.String(1)) 

    def __init__(self, name, email, password): 
     self.email = email 
     self.name = name 
     self.password = password 
     self.flag='N' 

Voici le schéma de table -

mysql> desc UserRemap; 
+----------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+----------+--------------+------+-----+---------+-------+ 
| name  | varchar(40) | NO |  | NULL |  | 
| password | varchar(64) | NO |  | NULL |  | 
| email | varchar(255) | NO |  | NULL |  | 
| flag  | char(1)  | NO |  | N  |  | 
+----------+--------------+------+-----+---------+-------+ 
4 rows in set (0.00 sec) 

quand je vais à shell python interactif et ne from myapp import db ; je reçois ce message d'erreur,

from server import db; Traceback (most recent call last): File 
"<stdin>", line 1, in <module> File "server.py", line 74, in 
<module> 
     class UserRemap(db.Model): 
    File "/usr/lib/python2.7/site-packages/Flask_SQLAlchemy-0.15-py2.7.egg/flaskext/sqlalchemy.py", 
line 467, in __init__ 
    DeclarativeMeta.__init__(self, name, bases, d) 
File "/usr/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-linux-i686.egg/sqlalchemy/ext/declarative.py", 
line 1336, in __init__ 
    _as_declarative(cls, classname, cls.__dict__) 
    File "/usr/lib/python2.7/site-packages/SQLAlchemy-0.7.5-py2.7-linux-i686.egg/sqlalchemy/ext/declarative.py", 
line 1261, in _as_declarative 
    "table-mapped class." % cls sqlalchemy.exc.InvalidRequestError: Class <class 'server.UserRemap'> does not have a __table__ or 
__tablename__ specified and does not inherit from an existing table-mapped class. 

Remarques sur la résolution de ce problème

Répondre

16

Vous avez parler __tablename__ ou __table__ de notifier sqlalchemy pour la table dans la base de données.

class UserRemap(db.Model): 
    __tablename__ = 'UserRemap' 
    name = db.Column(db.String(40)) 
    email = db.Column(db.String(255)) 
    password = db.Column(db.String(64)) 
    flag = db.Column(db.String(1)) 

    def __init__(self, name, email, password): 
     self.email = email 
     self.name = name 
     self.password = password 
     self.flag='N' 
+0

merci Lafada, ça marche maintenant. –

+1

:) profiter de la réponse continuer à poster :) – Nilesh

+8

Ajouter __tablename__ n'est pas nécessaire si votre classe a le même nom que la table. @lakshmipathi rencontre ce problème spécifique car il lui manque une clé primaire pour la table. – volker238

3

Spécifiez __tablename__ dans la définition de votre classe.

class UserRemap(db.Model): 
    __tablename__ = 'UserRemap' 
    name = db.Column(db.String(40)) 
    email = db.Column(db.String(255)) 
+0

merci jd, cela a fonctionné. –

92

par le Flask-SQLAlchemy docs héritant de db.Model configure automatiquement le nom de la table pour vous.

La raison pour laquelle ce message s'affiche parce que vous n'avez pas de clé primaire définie pour cette table. Le message d'erreur n'est pas utile, mais l'ajout d'une clé primaire résoudra ce problème.

+0

Que se passe-t-il si j'ai une classe abstraite qui possède quelques fonctions et attributs dont mes autres classes doivent hériter? Comment dois-je gérer correctement cet héritage? – benjaminz

+1

Gardez cela à l'esprit lors de la création de nouvelles tables ci-après. merci pour les détails. –

Questions connexes