Python Flask app.run是否创建实体副本?

Python Flask app.run是否创建实体副本?,python,sqlite,flask,flask-sqlalchemy,flask-admin,Python,Sqlite,Flask,Flask Sqlalchemy,Flask Admin,我使用了Python(3.6.4)、Flask(0.12.2)、Flask_admin(1.5.1)和Flask_sqlalchemy(2.3.2)的简单堆栈。我选择SQLite作为我的数据库 我的项目结构相当简单: 1) shared_db.py from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() from shared_db import db class City(db.Model): id = db.Colum

我使用了Python(3.6.4)、Flask(0.12.2)、Flask_admin(1.5.1)和Flask_sqlalchemy(2.3.2)的简单堆栈。我选择SQLite作为我的数据库

我的项目结构相当简单:

1) shared_db.py

from flask_sqlalchemy import SQLAlchemy 
db = SQLAlchemy()
from shared_db import db

class City(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

def fill_data(app):
    with app.app_context():
        db.create_all()
        db.session.add(City(name="Moscow"))
        db.session.add(City(name="New York"))
        db.session.add(City(name="London"))
        db.session.add(City(name="Paris"))
        db.session.commit()
from flask_admin.contrib.sqla import ModelView

from models import City

class CityView(ModelView):
    column_display_pk = True    # to force ids to appear in the Admin panel
    column_hide_backrefs = False
    column_list = ("id", "name")


def create_views(admin, db):
    admin.add_view(CityView(City, db.session))
import os

from flask_admin import Admin
from flask import Flask, jsonify, make_response, request

from shared_db import db
from models import fill_data
from model_views import create_views

app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db.init_app(app)
fill_data(app)

admin = Admin(app, 'My app')
create_views(admin, db)

if __name__ == "__main__":
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port, debug=True)
2) 型号.py

from flask_sqlalchemy import SQLAlchemy 
db = SQLAlchemy()
from shared_db import db

class City(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

def fill_data(app):
    with app.app_context():
        db.create_all()
        db.session.add(City(name="Moscow"))
        db.session.add(City(name="New York"))
        db.session.add(City(name="London"))
        db.session.add(City(name="Paris"))
        db.session.commit()
from flask_admin.contrib.sqla import ModelView

from models import City

class CityView(ModelView):
    column_display_pk = True    # to force ids to appear in the Admin panel
    column_hide_backrefs = False
    column_list = ("id", "name")


def create_views(admin, db):
    admin.add_view(CityView(City, db.session))
import os

from flask_admin import Admin
from flask import Flask, jsonify, make_response, request

from shared_db import db
from models import fill_data
from model_views import create_views

app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db.init_app(app)
fill_data(app)

admin = Admin(app, 'My app')
create_views(admin, db)

if __name__ == "__main__":
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port, debug=True)
3) 模型视图.py

from flask_sqlalchemy import SQLAlchemy 
db = SQLAlchemy()
from shared_db import db

class City(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

def fill_data(app):
    with app.app_context():
        db.create_all()
        db.session.add(City(name="Moscow"))
        db.session.add(City(name="New York"))
        db.session.add(City(name="London"))
        db.session.add(City(name="Paris"))
        db.session.commit()
from flask_admin.contrib.sqla import ModelView

from models import City

class CityView(ModelView):
    column_display_pk = True    # to force ids to appear in the Admin panel
    column_hide_backrefs = False
    column_list = ("id", "name")


def create_views(admin, db):
    admin.add_view(CityView(City, db.session))
import os

from flask_admin import Admin
from flask import Flask, jsonify, make_response, request

from shared_db import db
from models import fill_data
from model_views import create_views

app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db.init_app(app)
fill_data(app)

admin = Admin(app, 'My app')
create_views(admin, db)

if __name__ == "__main__":
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port, debug=True)
4) app.py

from flask_sqlalchemy import SQLAlchemy 
db = SQLAlchemy()
from shared_db import db

class City(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

def fill_data(app):
    with app.app_context():
        db.create_all()
        db.session.add(City(name="Moscow"))
        db.session.add(City(name="New York"))
        db.session.add(City(name="London"))
        db.session.add(City(name="Paris"))
        db.session.commit()
from flask_admin.contrib.sqla import ModelView

from models import City

class CityView(ModelView):
    column_display_pk = True    # to force ids to appear in the Admin panel
    column_hide_backrefs = False
    column_list = ("id", "name")


def create_views(admin, db):
    admin.add_view(CityView(City, db.session))
import os

from flask_admin import Admin
from flask import Flask, jsonify, make_response, request

from shared_db import db
from models import fill_data
from model_views import create_views

app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db.init_app(app)
fill_data(app)

admin = Admin(app, 'My app')
create_views(admin, db)

if __name__ == "__main__":
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port, debug=True)
导入操作系统
从flask_admin导入admin
从烧瓶导入烧瓶,jsonify,作出响应,请求
从共享数据库导入数据库
从模型导入填充数据
从模型视图导入创建视图
app=烧瓶(名称)
app.config[“密钥”]=“123456790”
app.config['SQLALCHEMY\u DATABASE\u URI']='sqlite://///myDB'
app.config[“SQLALCHEMY\u TRACK\u MODIFICATIONS”]=False
db.init_应用程序(应用程序)
填充数据(应用程序)
admin=admin(应用程序“我的应用程序”)
创建视图(管理员、数据库)
如果名称=“\uuuuu main\uuuuuuuu”:
port=int(os.environ.get('port',5000))
app.run(host='0.0.0.0',port=port,debug=True)

最后,我删除了
myDB
-文件(如果存在),并使用
python3app.py
运行该应用程序

令人惊讶的是,我最终得到了8个城市,而不是4个城市!我用DB Browser进行了一些调试,发现重复的4个城市就在最后一行代码--
app.run(…)
执行之后创建


如何使用预填充的数据库正确运行flask应用程序

如果每次应用程序启动时都需要对数据库进行种子设定,则需要进行填充数据库幂等元的操作。换句话说,在创建对象之前,您需要检查对象是否已经存在(因为当您没有删除数据库时,应用程序完全有可能重新启动)。可能会帮助您通过SQLAlchemy完成此行为