0

このチュートリアルからPyramidwikiを構築しています。

メインフォルダーの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オブジェクトを継承するためBase、models.pyファイル内のオブジェクトは、クラス定義が存在することさえ認識しません。したがって、BaseSQLテーブルの作成に実際に使用されるオブジェクトは空であるように見えるため、SQLテーブルを作成しようとはしません。これにより、「テーブルが見つかりません」というエラーメッセージが表示されます。

Baseこれを修正するには、ファイルに新しいオブジェクトを作成するのではなく、models/__init__.pyそのファイルをからインポートBasemypackage/__init__.py、そのBaseオブジェクトをのスーパークラスとして使用しますPage

于 2011-07-11T01:14:24.757 に答える