有哪些方法可以为 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 应用程序播种?的主要内容,如果未能解决你的问题,请参考以下文章
创建测试范围/上下文以播种数据并运行应用程序,Scala Play Framework 2