我在项目中使用模型继承。
我的模特:
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'未映射
这是我的Base
:
Base = declarative_base()
没有继承,所有工作都应该如此。 如何解决?
提前完成!
答案 0 :(得分:5)
我偶然发现了同样的问题。问题是我填充表格的方式:
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()
...
答案 1 :(得分:3)
无法重现。上面的代码适用于最近的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>]
答案 2 :(得分:0)
只需删除__abstract__ = True