2012-03-12 37 views
14

Khi tôi cố gắng thêm một bảng mới để python/bình -Lớp không có một bảng hoặc tablename quy định và không kế thừa từ một lớp bảng ánh xạ hiện

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' 

Dưới đây là sơ đồ bảng -

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) 

khi tôi đi đến vỏ python tương tác và đã from myapp import db ; tôi nhận được thông báo lỗi này,

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. 

Bất kỳ suy nghĩ nào về cách sửa lỗi này

Trả lời

16

Bạn cần phải đề cập đến __tablename__ hoặc __table__ thông báo SQLAlchemy cho bảng trong cơ sở dữ liệu.

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

nhờ Lafada, Nó hoạt động ngay bây giờ. –

+1

:) tận hưởng câu trả lời tiếp tục đăng bài :) – Nilesh

+8

Thêm '__tablename__' là không cần thiết nếu lớp của bạn có cùng tên với bảng. @ lakshmipathi đang gặp sự cố cụ thể này vì anh ấy thiếu khóa chính cho bảng. – volker238

3

Chỉ định __tablename__ trong định nghĩa lớp học của bạn.

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

cảm ơn jd, nó hoạt động. –

92

Mỗi Flask-SQLAlchemy docs kế thừa từ db.Model sẽ tự động thiết lập tên bảng cho bạn.

Lý do bạn thấy thông báo này là do bạn không có khóa chính được xác định cho bảng đó. Thông báo lỗi là không hữu ích, nhưng việc thêm khóa chính sẽ khắc phục sự cố này.

+0

Điều gì xảy ra nếu tôi có một lớp trừu tượng có một vài hàm và thuộc tính mà tôi muốn các lớp khác của tôi kế thừa? Làm thế nào tôi sẽ xử lý thừa kế này đúng cách? – benjaminz

+1

Sẽ ghi nhớ điều này trong khi tạo bảng mới sau đây. cảm ơn cho các chi tiết. –

Các vấn đề liên quan