我有一个语言的数据库表,里面存储着相对静态的内容:
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中,以允许用户指定他们所说的语言/创建的页面所使用的语言。)
我的尝试
提供一个端点,当调用时会添加这个东西:
@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)
该解决方案的缺点:
- 我的端点只应该被调用一次
- 我可能会忘记运行它
db = SQLAlchemy()
和class Language(db.Model):
这两个语句对我来说没有意义,除非你同时使用了Flask-SQLAlchemy。 - roganjoshdb = SQLAlchemy()
不会在应用程序上注册。 - roganjoshdb.init_app(app)
。 - Martin Thoma