2012-03-12 7 views
14

Cuando traté de añadir una nueva tabla para Python/frasco -clase no tiene una tabla o un nombre de tabla especificados y no se hereda de una clase mesa asignada existente

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' 

Aquí es un esquema de tablas -

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) 

cuando voy a Python shell interactivo y tenía from myapp import db ; me sale este mensaje de error,

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. 

Cualquier idea sobre cómo solucionarlo

Respuesta

16

se tiene que mencionar __tablename__ o __table__ para notificar sqlalchemy para la tabla de la base de datos.

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

gracias Lafada, funciona ahora. –

+1

:) disfruta la respuesta sigue publicando :) – Nilesh

+8

Agregar '__tablename__' no es necesario si tu clase tiene el mismo nombre que la tabla. @lakshmipathi está teniendo este problema específico porque le falta una clave primaria para la tabla. – volker238

3

Especifique __tablename__ en la definición de su clase.

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

gracias jd, funcionó. –

92

por el frasco-SQLAlchemy docs heredando de db.Model configurará automáticamente el nombre de la tabla para usted.

La razón por la que está viendo este mensaje es porque no tiene una clave principal definida para esa tabla. El mensaje de error es poco útil, pero agregar una clave principal solucionará este problema.

+0

¿Qué sucede si tengo una clase abstraída que tiene un par de funciones y atributos de los que quiero que hereden mis otras clases? ¿Cómo manejaré esta herencia correctamente? – benjaminz

+1

Tendrá esto en cuenta al crear nuevas tablas más adelante. gracias por los detalles. –

Cuestiones relacionadas