使用Pyramid和SQLite创建DB的问题

时间:2011-07-09 00:16:37

标签: sqlite sqlalchemy creation

我正在从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

我做错了什么?

1 个答案:

答案 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的超类。