类没有指定表或表名,也不从现有的表映射类继承

web*_*org 16 python mysql sqlalchemy flask-sqlalchemy

当我尝试将新表添加到python/flask时 -

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'
Run Code Online (Sandbox Code Playgroud)

这是表模式 -

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)
Run Code Online (Sandbox Code Playgroud)

当我去交互式python shell并且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.
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法

vol*_*238 96

根据Flask-SQLAlchemy继承的文档db.Model将自动为您设置表名.

您看到此消息是因为您没有为该表定义主键.错误消息无济于事,但添加主键将解决此问题.

  • 如果我有一个抽象类,它有几个我希望其他类继承的函数和属性,该怎么办?我该如何正确处理这个继承? (2认同)

Nil*_*esh 19

您必须提及__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'
Run Code Online (Sandbox Code Playgroud)

  • 如果您的类与表名相同,则不需要添加`__tablename__`.@lakshmipathi遇到了这个特定问题,因为他缺少表的主键. (10认同)