有哪些方法可以为 Flask 应用程序播种?

Posted

技术标签:

【中文标题】有哪些方法可以为 Flask 应用程序播种?【英文标题】:What ways are there for seeding a Flask app? 【发布时间】:2019-12-06 05:26:36 【问题描述】:

我即将在 aws Elastic Beanstalk 上部署一个非常简单的烧瓶应用程序。我必须通过哪些方式放置一些种子数据,以便实时实例拥有一些用户?

from dateutil import parser
from datetime import datetime
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'db.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
ma = Marshmallow(app)


.
.
.

@app.route('/user/<id>', methods=['PUT'])
def update_user(id):
    user = User.query.get(id)
    weight = request.json['weight']
    user.weight = weight
    db.session.commit()
    return user_schema.jsonify(user)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    weight = db.Column(db.Float)
    workouts = db.relationship('Workout', backref='user', lazy=True)

    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

class UserSchema(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'weight')

user_schema = UserSchema(strict=True)
users_schema = UserSchema(many=True, strict=True)

.
.
.

db.create_all()

if __name__ == '__main__':
    app.run(debug=True)

再次,我希望实时实例有一些种子数据(我知道我可以在本地使用控制台创建一些条目)。我在想我应该把包含种子放在块中

if __name__ == '__main__':
    user1 = User('Jon',75)
    db.session.add(user1)
    db.session.commit()

但我不确定执行此操作的正确方法是什么。 每次启动应用程序时也不会运行吗?我只需要它在第一次运行一次

【问题讨论】:

How do I seed a flask sql-alchemy database的可能重复 【参考方案1】:

前段时间我对我的新 Flask 应用程序有类似的需求,我通过使用 Faker 库创建一个函数来添加一些初始数据来解决它,然后使用来自 Click 库的 cli 命令调用它,因为我只需要运行一次。我想它也可以为你工作。请注意,两者都是外部库。

这是一个可能适用于您的案例的示例 - 根据需要进行修改:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os

import click
import random

from faker import Faker


app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

fake = Faker() #initialize faker service

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'db.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    weight = db.Column(db.Float)
    workouts = db.relationship('Workout', backref='user', lazy=True)

    def __init__(self, name, weight):
        self.name = name
        self.weight = weight
rest of your code...

这个函数将被 Cli 命令调用来完成这个技巧

@click.command()
@click.option('--count', default=20, help='number of users to be generated')
def add_users(count):
    """
    Generate fake users.
    """
    random_usernames = []
    data = []

    click.echo('Working...')

    # Ensure we get the count number of usernames.

    for i in range(0, count):
        random_usernames.append(fake.first_name())

    random_usernames = list(set(random_usernames))

    while True:
        if len(random_usernames) == 0:
            break

        username = random_usernames.pop()
        weight = random.uniform(30.5,260.5)

        user = User(username, weight)
        db.session.add(user)
        db.session.commit()


    return click.echo(' users were added successfully to the database.'.format(count))

if __name__ == '__main__':
    add_users()

最后,在命令行中调用 cli 命令。

$ python app.py --count=50
Working...
50 users were added successfully to the database.

与Faker一起点击非常有帮助,希望它适合你。

【讨论】:

以上是关于有哪些方法可以为 Flask 应用程序播种?的主要内容,如果未能解决你的问题,请参考以下文章

FIL和BTC挖矿有哪些差异?IPFS有落地应用吗?

FIL和BTC挖矿有哪些差异?IPFS有落地应用吗?

创建测试范围/上下文以播种数据并运行应用程序,Scala Play Framework 2

高并发场景下锁

为 Dockerized Django 应用程序播种 MySQL 数据库

Python 都有哪些好的 Web 框架