gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:13:50 25 4
gpt4 key购买 nike

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

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

data is in a 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)

该解决方案的缺点:
  • 我有一个只能调用一次的端点
  • 我可能会忘记运行它
  • 最佳答案

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

    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 模块调用 flask app 对象和 SQLAlchemy 对象(来自 flask-sqlalchemy)。 TableModel是映射到数据库中所需表的类。我用了 @app.before_first_requestpandas.DataFrame.to_sql 一起装饰方法,这样数据库的初始化(包括从 csv 插入数据)只会在应用程序最初启动时执行一次。我不确定 alembic虽然是你的要求,但是 pandas确实为我工作,我希望这会有所帮助。

    关于python - 如何使用 Flask/SQLalchemy/Alembic 初始化数据库表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56601772/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com