2011-07-09 9 views
0

私はthisチュートリアルからPyramid wikiを構築しています。PyramidとSQLiteでDBを作成する際の問題

メインフォルダのファイル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` 

- 私は「という名前のテーブルのページを見つけることができません」を取得エラー。今

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 

私はこれで最後の行を交換した場合、すべてが動作します:これは私のmodels.pyファイルである私が間違って何をやっている

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 

答えて

2

models.pyファイルには、initialize_sqlの機能があります。

しかし、Pageクラス定義を新しいファイルに切り替えたときに、このオブジェクトが新しいオブジェクトに変更されたときに、このBaseオブジェクトを使って定義されたオブジェクトのすべてのテーブルを効果的に作成する `Base.metadata.create_all新しいBaseオブジェクトを作成しました。Pageクラスがこの新しいBaseオブジェクトから継承しているため、オブジェクトはmodels.pyファイル内に継承されているため、クラス定義が存在することはありません。 SQLテーブルが空であるように見えるため、SQLテーブルを作成しようとしません。その結果、「テーブルが見つかりません」というエラーメッセージが表示されます。

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

関連する問題