Приложение Flask SQLAlchemy MySQL с тестовой базой данных SQLite?

Некоторое время я работал над приложением Flask, используя SQLAlchemy для доступа к базе данных MySQL. Я наконец начал писать тесты для этого (я твердо верю в тестирование, но я новичок в Flask, SQLA и Python в этом отношении, поэтому отложил это), и у меня возникла проблема с настройкой моей структуры.

Моя производственная база данных не использует какие-либо необычные функции MySQL, и на других языках / фреймворках я смог настроить тестовую среду, используя базу данных SQLite в памяти. (Например, у меня есть приложение Perl, использующее DBIx::Class для запуска базы данных SQL Server, но с набором тестов, построенным на SQLite.) Однако с SQLAlchemy мне нужно было объявить несколько конкретных вещей MySQL в моей модели, и я не знаю, как это обойти. В частности, я использую типы TINYINT и CHAR для нескольких столбцов, и мне кажется, что мне нужно импортировать их из sqlalchemy.dialects.mysql, поскольку это не общие типы в SQLA. Таким образом, у меня будет объявление класса, например:

class Item(db.Model):
    ...
    size = db.Column(TINYINT, db.ForeignKey('size.size_id'), nullable=False)

Итак, даже если бы я использовал необработанный SQL, я мог бы использовать TINYINT с SQLite или MySQL, и он работал бы нормально, здесь он исходит из класса диалекта mysql.

Я не хочу переопределять весь свой класс модели, чтобы охватить такие, казалось бы, тривиальные вещи, как это. Есть ли другое решение? Я читал все, что мог, об использовании разных баз данных для тестирования и производства, но об этой проблеме не упоминалось. Было бы намного проще использовать базу данных SQLite в памяти для тестирования, вместо того, чтобы иметь доступную для всего тестовую базу данных MySQL.

Рискуя показаться действительно придирчивым, вам не нужна БД для модульного тестирования. Это другая история для интеграционных тестов и выше, в которых вы, вероятно, должны использовать целевую БД. Но: ваша конкретная проблема с набором текста может быть решена с помощью варианта: docs.sqlalchemy.org/en/latest/core/…. Для более сложных случаев вам, возможно, придется написать свой собственный TypeDecorator, например бэкэнд-независимый тип GUID.

Ilja Everilä 19.03.2018 12:39

Ваша придирка была совершенно правильной: я написал «модульные тесты», но на самом деле я пишу как модульные, так и интеграционные тесты. Я отредактировал свой пост, чтобы полностью удалить "юнит". Спасибо за предложения, которые, похоже, помогут решить эту проблему.

user1235777 19.03.2018 19:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
2
551
0

Другие вопросы по теме