Как я могу инициализировать таблицу базы данных с помощью Flask / SQLalchemy / Alembic? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть база данных языков с относительно статичным содержанием:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Language(db.Model):
    __tablename__ = 'languages'

    # Fields
    code = db.Column(db.String(2), primary_key=True)
    name = db.Column(db.String(40))
    native = db.Column(db.String(60))
    rtl = db.Column(db.Boolean())  # right to left

Данные находятся в формате CSV . Я хочу вставить его в базу данных. Могу ли я сделать это с Alembic?

Я инициализирую все таблицы (структуру, а не данные) с

$ flask db init
$ flask db migrate
$ flask db update

(Дополнительный вопрос: должно ли это быть в первую очередь в базе данных или, скорее, в качестве кода CSV в коде? Я использую его в CMS, чтобы пользователи могли указать, на каких языках говорят / на каком языке страницы они создали.)

My Try

Предоставление конечной точки, которая добавляет материал при вызове:

@app.route('/secret_init_languages')
def db_init_languages():
    from mpu.string import str2bool
    import csv
    path = resource_filename('my_package', 'static/languages.csv')
    nb_languages = 0
    with open(path, 'rt', newline='') as csvfile:
        csvreader = csv.reader(csvfile, delimiter=',')
        next(csvreader, None)  # skip the headers
        for row in csvreader:
            lang = Language(code=row[0],
                            name=row[1],
                            native=row[2],
                            rtl=str2bool(row[3]))
            db.session.add(lang)
            nb_languages += 1
        db.session.commit()
    return 'Added {} languages'.format(nb_languages)

Недостатки этого решения:

  • У меня есть конечная точка, которую нужно вызывать только один раз
  • Я мог бы забыть запустить его
...