У меня есть база данных языков с относительно статичным содержанием:
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)
Недостатки этого решения:
- У меня есть конечная точка, которую нужно вызывать только один раз
- Я мог бы забыть запустить его