0

我正在根据教程构建 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`

这不起作用 - 我收到“找不到名为 pages 的表”错误。这是我的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

我究竟做错了什么?

4

1 回答 1

2

在您的 models.py 文件中,您会注意到该initialize_sql功能。此函数调用“Base.metadata.create_all()”函数,该函数有效地为使用该 Base 对象定义的对象创建所有表。

但是,当您将Page类定义切换到新文件时,您已经创建了一个新Base对象。由于Page类继承自这个新Base对象,Basemodels.py 文件中的对象永远不会识别出类定义甚至存在。因此,Base实际用于创建 SQL 表的对象看起来是空的,因此不会尝试创建 SQL 表。这会导致您的“找不到表”错误消息。

要解决此问题,而不是在文件中创建新Base对象,请从models/__init__.py导入该文件,并将该对象用作.Basemypackage/__init__.pyBasePage

于 2011-07-11T01:14:24.757 回答