Проблема с созданием БД с помощью Pyramid и SQLite - PullRequest
0 голосов
/ 09 июля 2011

Я строю вики Pyramid из этого учебного пособия.

Все работает хорошо, за исключением случаев, когда вы пытаетесь создать папку для моих моделей вместо того, чтобы иметь их в файле models.pyв основной папке.

Я создал папку моделей, добавил в нее файл __init__.py и файл Page с содержанием:

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 Ответ

2 голосов
/ 11 июля 2011

В вашем файле models.py вы заметите функцию initialize_sql.Эта функция вызывает функцию Base.metadata.create_all (), которая эффективно создает все таблицы для объектов, которые были определены с использованием этого базового объекта.

Однако, когда вы переключили определение класса Page вВ новом файле вы создали новый объект * 1005. * Поскольку класс Page наследуется от этого нового объекта Base, объект Base в файле models.py никогда не распознает, что определение класса вообще существует.Поэтому объект Base, который фактически используется для создания таблиц SQL, кажется пустым и поэтому не пытается создать таблицу SQL. Это приводит к появлению сообщения об ошибке «Не удается найти таблицу».

Чтобы исправить это, вместо создания нового объекта Base в файле models/__init__.py, импортируйте этот файл Base из mypackage/__init__.py и используйте этот объект Base в качестве суперкласса для Page.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...