Python SQLAlchemy未映射类错误:未映射类“SQLAlchemy.ext.declarative.DeclarativeMeta”

Python SQLAlchemy未映射类错误:未映射类“SQLAlchemy.ext.declarative.DeclarativeMeta”,python,sqlalchemy,Python,Sqlalchemy,我在我的项目中使用模型继承 我的模型: class CommentBase(Base): __abstract__ = True id = Column(Integer, primary_key=True) text = Column(Unicode(500)) @declared_attr def user_id(cls): return Column(ForeignKey('user.id')) @declared_att

我在我的项目中使用模型继承

我的模型:

class CommentBase(Base):
    __abstract__ = True

    id = Column(Integer, primary_key=True)
    text = Column(Unicode(500))

    @declared_attr
    def user_id(cls):
        return Column(ForeignKey('user.id'))

    @declared_attr
    def user(cls):
        return relationship('User')

    def __init__(self, user_id, text):
        self.user_id = user_id
        self.text = text

class CommentOne(CommentBase):
    __tablename__ = 'comment_one'

class CommentTwo(CommentBase):
    __tablename__ = 'comment_two'
所有表都正确创建,但当我尝试使用一些测试数据填充表时,即使是那些没有从其他表继承的表,也会引发错误:

UnmappedClassError:未映射类'sqlalchemy.ext.declarative.DeclarativeMeta'

这里是我的基地:

没有继承,一切照旧。 如何修复它


提前到达塔克斯

无法复制。以上代码适用于最新的0.7和0.8版本:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base, declared_attr

Base = declarative_base()


class CommentBase(Base):
    __abstract__ = True

    id = Column(Integer, primary_key=True)
    text = Column(Unicode(500))

    @declared_attr
    def user_id(cls):
        return Column(ForeignKey('user.id'))

    @declared_attr
    def user(cls):
        return relationship('User')

    def __init__(self, user_id, text):
        self.user_id = user_id
        self.text = text

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)

class CommentOne(CommentBase):
    __tablename__ = 'comment_one'

class CommentTwo(CommentBase):
    __tablename__ = 'comment_two'


e = create_engine("sqlite://", echo=True)

Base.metadata.create_all(e)

s = Session(e)

u1 = User()
s.add(u1)
s.flush()

s.add_all([CommentOne(user_id=u1.id, text="c1"), CommentTwo(user_id=u1.id, text="c2")])
s.commit()

print s.query(CommentOne).all()
输出:

2012-08-07 18:47:10,727 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("user")
2012-08-07 18:47:10,727 INFO sqlalchemy.engine.base.Engine ()
2012-08-07 18:47:10,727 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("comment_one")
2012-08-07 18:47:10,727 INFO sqlalchemy.engine.base.Engine ()
2012-08-07 18:47:10,728 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("comment_two")
2012-08-07 18:47:10,728 INFO sqlalchemy.engine.base.Engine ()
2012-08-07 18:47:10,728 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE user (
    id INTEGER NOT NULL, 
    PRIMARY KEY (id)
)


2012-08-07 18:47:10,728 INFO sqlalchemy.engine.base.Engine ()
2012-08-07 18:47:10,729 INFO sqlalchemy.engine.base.Engine COMMIT
2012-08-07 18:47:10,729 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE comment_one (
    id INTEGER NOT NULL, 
    text VARCHAR(500), 
    user_id INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY(user_id) REFERENCES user (id)
)


2012-08-07 18:47:10,729 INFO sqlalchemy.engine.base.Engine ()
2012-08-07 18:47:10,729 INFO sqlalchemy.engine.base.Engine COMMIT
2012-08-07 18:47:10,730 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE comment_two (
    id INTEGER NOT NULL, 
    text VARCHAR(500), 
    user_id INTEGER, 
    PRIMARY KEY (id), 
    FOREIGN KEY(user_id) REFERENCES user (id)
)


2012-08-07 18:47:10,730 INFO sqlalchemy.engine.base.Engine ()
2012-08-07 18:47:10,730 INFO sqlalchemy.engine.base.Engine COMMIT
2012-08-07 18:47:10,732 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2012-08-07 18:47:10,733 INFO sqlalchemy.engine.base.Engine INSERT INTO user DEFAULT VALUES
2012-08-07 18:47:10,733 INFO sqlalchemy.engine.base.Engine ()
/Users/classic/dev/sa07/lib/sqlalchemy/engine/default.py:463: SAWarning: Unicode type received non-unicode bind param value.
  param.append(processors[key](compiled_params[key]))
2012-08-07 18:47:10,751 INFO sqlalchemy.engine.base.Engine INSERT INTO comment_two (text, user_id) VALUES (?, ?)
2012-08-07 18:47:10,751 INFO sqlalchemy.engine.base.Engine ('c2', 1)
2012-08-07 18:47:10,753 INFO sqlalchemy.engine.base.Engine INSERT INTO comment_one (text, user_id) VALUES (?, ?)
2012-08-07 18:47:10,753 INFO sqlalchemy.engine.base.Engine ('c1', 1)
2012-08-07 18:47:10,753 INFO sqlalchemy.engine.base.Engine COMMIT
2012-08-07 18:47:10,754 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2012-08-07 18:47:10,754 INFO sqlalchemy.engine.base.Engine SELECT comment_one.id AS comment_one_id, comment_one.text AS comment_one_text, comment_one.user_id AS comment_one_user_id 
FROM comment_one
2012-08-07 18:47:10,754 INFO sqlalchemy.engine.base.Engine ()
[<__main__.CommentOne object at 0x1014e37d0>]

我只是在同样的问题上绊倒了。问题在于我填充表格的方式:

s = application.models.Sample
s.label = 'asdf'
db_session.add(s)

UnmappedInstanceError: Class 'sqlalchemy.ext.declarative.api.DeclarativeMeta' is not mapped; was a class (application.models.Sample) supplied where an instance was required?
当我修复我的实例化时,它工作得很好:

s = application.models.Sample()
...
只需删除_uabstract _;=True

s = application.models.Sample()
...