2012-03-12 4 views
14

Когда я пытался добавить новую таблицу в питоне/колбу -Класса не имеет таблицы или имя_таблица указана и не наследуется от существующей таблицы отображенного класса

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' 

Вот схема таблицы -

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) 

, когда я иду в интерактивной оболочке Python и сделал from myapp import db ; я получаю сообщение об ошибке,

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. 

Любые мысли о том, как исправить это

ответ

16

Вы должны упомянуть __tablename__ или __table__ уведомить SQLAlchemy для таблицы в базе данных.

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

спасибо Lafada, сейчас он работает. –

+1

:) наслаждайтесь ответом, оставляя сообщение :) – Nilesh

+8

Добавление '__tablename__' не требуется, если ваш класс имеет то же имя, что и таблица. @lakshmipathi имеет эту специфическую проблему, потому что у него отсутствует первичный ключ для таблицы. – volker238

3

Задайте __tablename__ в своем определении класса.

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

спасибо jd, это сработало. –

92

За Колбу-SQLAlchemy docs унаследовав от db.Model автоматически установить имя таблицы для вас.

Причина, по которой вы видите это сообщение, состоит в том, что у вас нет первичного ключа, определенного для этой таблицы. Сообщение об ошибке является бесполезным, но добавление первичного ключа устранит эту проблему.

+0

Что делать, если у меня есть абстрактный класс, который имеет несколько функций и атрибутов, которые я хочу, чтобы мои другие классы наследовали? Как правильно обращаться с этим наследованием? – benjaminz

+1

Помните об этом при создании новых таблиц в дальнейшем. спасибо за подробности. –