我正在从this教程构建Pyramid wiki。
一切正常,除非尝试为我的模型创建一个文件夹,而不是将它们放在主文件夹的models.py文件中。
我创建了一个模型文件夹,向其添加了__init__.py
文件,以及一个包含内容的页面文件:
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import Text
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Page(Base):
""" The SQLAlchemy declarative model class for a Page object. """
__tablename__ = 'pages'
id = Column(Integer, primary_key=True)
name = Column(Text, unique=True)
data = Column(Text)
def __init__(self, name, data):
self.name = name
self.data = data`
这不起作用 - 我得到一个“找不到表命名页面”的错误。这是我的models.py
文件:
import transaction
from sqlalchemy.exc import IntegrityError
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import Text
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()
from test.models.Page import Page
现在如果我用这个替换最后一行,一切正常:
class Page(Base):
""" The SQLAlchemy declarative model class for a Page object. """
__tablename__ = 'pages'
id = Column(Integer, primary_key=True)
name = Column(Text, unique=True)
data = Column(Text)
def __init__(self, name, data):
self.name = name
self.data = data
我做错了什么?
答案 0 :(得分:2)
在models.py文件中,您会注意到initialize_sql
函数。此函数调用`Base.metadata.create_all()“函数,该函数有效地为使用该Base对象定义的对象创建所有表。
但是,当您将Page
类定义切换到新文件时,您已创建了一个新的Base
对象。由于Page
类继承自这个新的Base
对象,因此models.py文件中的Base
对象永远不会识别出类定义甚至存在。因此,实际用于创建SQL表的Base
对象似乎为空,因此不会尝试创建SQL表。这会导致您的“无法找到表格”错误消息。
要解决此问题,请在Base
文件中创建新的models/__init__.py
对象,而不要从Base
导入mypackage/__init__.py
,然后使用Base
} object作为Page
的超类。