Схема квалифицированных таблиц с SQLAlchemy, SQLite и Postgresql? - PullRequest
8 голосов
/ 21 апреля 2010

У меня есть проект Pylons и модель SQLAlchemy, которая реализует таблицы, соответствующие схеме:

class Hockey(Base):
    __tablename__ = "hockey"
    __table_args__ = {'schema':'winter'}
    hockey_id = sa.Column(sa.types.Integer, sa.Sequence('score_id_seq', optional=True), primary_key=True)
    baseball_id = sa.Column(sa.types.Integer, sa.ForeignKey('summer.baseball.baseball_id'))

Этот код прекрасно работает с Postgresql, но не работает при использовании SQLite для имен таблиц и внешних ключей (из-за отсутствия поддержки схемы в SQLite)

sqlalchemy.exc.OperationalError: (OperationalError) неизвестная база данных "зима" 'PRAGMA "зима" .table_info ("хоккей")' ()

Я бы хотел продолжить использовать SQLite для разработки и тестирования.

Есть ли способ изящно завершить это на SQLite?

Ответы [ 2 ]

9 голосов
/ 23 января 2011

Я бы хотел продолжить использовать SQLite для Разработка и тестирование.

Есть ли способ получить этот сбой изящно на SQLite?

Трудно понять, с чего начать с такого рода вопросом. Так . , .

Перестань. Просто прекрати.

Некоторые разработчики не могут позволить себе роскошь разработки на своей целевой платформе. Их жизнь трудна: они переносят код (а иногда и компиляторы) из одной среды в другую, дважды отлаживают (иногда приходится отлаживать удаленно на целевой платформе), постепенно осознавая, что грызть их внутренности на самом деле начало язвы.

Установить PostgreSQL.

Когда вы можете использовать одну и ту же среду базы данных для разработки, тестирования и развертывания, вы должны .

Не говоря уже о команде QA. С какой стати они тестируют вещи, которые не собираются отправлять? Если вы развертываете на PostgreSQL, убедитесь в качестве своей работы на PostgreSQL.

Серьезно.

2 голосов
/ 01 февраля 2011

Я сам только начинающий, и я не пользовался пилонами, но ...

Я заметил, что вы комбинируете таблицу и связанный класс вместе. Как насчет того, чтобы разделить их?

import sqlalchemy as sa
meta = sa.MetaData('sqlite:///tutorial.sqlite')
schema = None
hockey_table = sa.Table('hockey', meta,
                      sa.Column('score_id', sa.types.Integer, sa.Sequence('score_id_seq', optional=True), primary_key=True),
                      sa.Column('baseball_id', sa.types.Integer, sa.ForeignKey('summer.baseball.baseball_id')),
                      schema = schema,
                    )

meta.create_all()

Тогда вы можете создать отдельный

class Hockey(Object):
    ...

и

mapper(Hockey, hockey_table)

Тогда просто установите схему выше = Нет везде, если вы используете sqlite, и значения, которые вы хотите в противном случае.

У вас нет рабочего примера, поэтому приведенный выше пример тоже не рабочий. Однако, как отмечали другие люди, попытка поддерживать переносимость между базами данных в конечном итоге является проигрышной игрой. Я бы добавил +1 к людям, предлагающим везде использовать PostgreSQL.

HTH, С уважением.

...