2012-03-12 10 views
14

Quando ho provato ad aggiungere una nuova tabella di python/fiasco -classe non ha un tavolo o nometabella specificati e non eredita da una classe tavolo-mapped esistente

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' 

Ecco schema della tabella -

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) 

quando vado a shell interattiva di Python e ho from myapp import db ; ricevo questo messaggio di errore,

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. 

Qualsiasi idea su come risolvere questo problema

risposta

16

dovete parlare __tablename__ o __table__ di notificare sqlalchemy per la tabella nel database.

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

grazie Lafada, funziona ora. –

+1

:) goditi la risposta continua a postare :) – Nilesh

+8

L'aggiunta di '__tablename__' non è necessaria se la tua classe ha lo stesso nome della tabella. @lakshmipathi sta avendo questo problema specifico perché manca una chiave primaria per la tabella. – volker238

3

Specificare __tablename__ nella definizione della classe.

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

grazie jd, ha funzionato. –

92

Per il Flask-SQLAlchemy docs eredita da db.Model verrà automaticamente impostare il nome della tabella per voi.

Il motivo per cui viene visualizzato questo messaggio è perché non è stata definita una chiave primaria per tale tabella. Il messaggio di errore è un po 'inutile, ma l'aggiunta di una chiave primaria risolverà questo problema.

+0

Cosa succede se ho una classe astratta che ha un paio di funzioni e attributi da cui ereditare le altre mie classi? Come gestirò correttamente questa eredità? – benjaminz

+1

Tienilo a mente mentre crei nuovi tavoli qui di seguito. grazie per i dettagli –

Problemi correlati