2012-03-12 18 views
14

から継承していない -クラスは、指定したテーブルまたはテーブル名を持っていないと私のpython /フラスコに新しいテーブルを追加しようとすると、既存のテーブルにマップされたクラス

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

は、データベース内のテーブルのためのSQLAlchemyのを通知する__tablename__または__table__を言及する必要があります。フラスコSQLAlchemyのdocsパー

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

あなたのためのセットアップテーブル名を自動的にdb.Modelから継承されます。

このメッセージが表示されるのは、そのテーブルにプライマリキーが定義されていないためです。エラーメッセージは一種のものではありませんが、主キーを追加することでこの問題が解決されます。

+0

他のクラスに継承させたい、いくつかの関数と属性を持つ抽象クラスがある場合はどうなりますか?どのようにしてこの相続財産を適切に処理しますか? – benjaminz

+1

これ以降、新しいテーブルを作成する際には、このことを念頭に置いてください。詳細をありがとう。 –

関連する問題