Как использовать те же модели для тестирования и разработки / производства, когда в sqlite отсутствуют некоторые функции - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть flask -sqlalchemy приложение

  • Для разработки и производства я хочу использовать mysql
  • Для тестирования я хочу использовать sqlite.

В файле models.py у меня есть следующий класс:

....
from flask_sqlalchemy import SQLAlchemy
....
db = SQLAlchemy()
....
class Post(db.Model):
    __tablename__ = 'posts'
    __table_args__ = {'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8', 'mysql_collate': 'utf8_general_ci'}

    id = db.Column(db.INTEGER, primary_key=True)
    title = db.Column(db.Text, nullable=False)
    body = db.Column(db.Text, nullable=False)
    creation_date = db.Column(db.DATETIME, server_default=db.text("CURRENT_TIMESTAMP"))
    update_date = db.Column(db.DATETIME, server_default=db.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
....

Эта модель прекрасно работает в процессе разработки (при подключении к mysql db), однако, когда я пытаюсь запустить тесты (подключение к mysqlite db) я получаю следующее исключение

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "ON": syntax error [SQL: '\nCREATE TABLE posts (\n\tid INTEGER NOT NULL, \n\ttitle TEXT NOT NULL, \n\tbody TEXT NOT NULL,\n\tcreation_date DATETIME DEFAULT CURRENT_TIMESTAMP, \n\tupdate_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, \n)'] (Background on this error at: http://sqlalche.me/e/e3q8)\n

Он жалуется на «ON UPDATE CURRENT_TIMESTAMP» в поле update_date. Я попытался удалить эту часть из models.py, и тесты работали нормально, так что это должно быть проблемой.

Есть ли способ продолжать использовать sqlite для тестирования и избежать подобных проблем?

...