首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Flask / SQLalchemy / Alembic初始化数据库表?

如何使用Flask / SQLalchemy / Alembic初始化数据库表?
EN

Stack Overflow用户
提问于 2019-06-14 16:04:13
回答 1查看 5.3K关注 0票数 5

我有一个具有相对静态内容的语言的数据库表:

代码语言:javascript
复制
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中。我想把它插入数据库。我能用镇痛片做这个吗?

将所有表(结构,而不是数据)初始化为

代码语言:javascript
复制
$ flask db init
$ flask db migrate
$ flask db update

(附带问题:这是首先在数据库中,还是作为代码中的CSV?我在CMS中使用它,允许用户指定所使用的语言/页面创建的语言。)

我的尝试

提供一个端点,该端点在调用时添加内容:

代码语言:javascript
复制
@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)

该解决方案的缺点:

  • 我有一个端点,应该只调用一次。
  • 我可以忘记运行它
EN

回答 1

Stack Overflow用户

发布于 2020-08-06 20:59:58

还不确定您是否已经解决了这个问题,我也遇到过一个类似的问题,使用SQLAlchemy和烧瓶初始化一个使用csv的数据库表。以下解决方案对我有效(不使用alembic):

代码语言:javascript
复制
from main.app import app
from main.db import db
from models.table import TableModel
from pandas import read_csv

db.init_app(app)

@app.before_first_request
def create_tables():
    db.create_all()
    # Check if the existing table contain data, if not then initialize with csv insert
    s = db.session()
    if len(s.query(TableModel).all()) == 0:
        print('No data in the table detected.')
        print('Initialising the table in database.')
        engine = s.get_bind()
        df = read_csv('./table.csv')
        df.to_sql('table',
                  con=engine,
                  if_exists='append',
                  chunksize=1000,
                  index=False)

app.run(port=5000, debug=True)

注意,上面的代码包含在一个run.py脚本中,它分别从main.app和main.db模块调用烧瓶app对象和SQLAlchemy对象(来自烧瓶-sqlalchemy)。TableModel是到数据库中所需表的类映射。我使用了@app.before_first_request装饰器和pandas.DataFrame.to_sql方法,这样数据库的初始化(包括从csv插入数据)只能在应用程序最初启动时执行一次。我不确定alembic是否是您的要求,但是pandas确实为我工作过,我希望这会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56601772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档