Flask + SQLAlchemy:通过运行python脚本向数据库加载记录

时间:2018-08-10 15:12:27

标签: python flask sqlalchemy flask-sqlalchemy

我正在尝试在烧瓶应用程序中使用SQLALchemy加载数据库一次。我以为我可以通过从终端命令运行脚本来将记录添加到数据库中,但是似乎我在执行python脚本时遇到困难?

  • 是否通过运行export FLASK_APP=app/__init__.py然后flask run初始化应用程序甚至加载数据库?
  • 是否每次都重新启动本地服务器

文件夹结构:

  app
    api
      __init__.py
      log.py
    tasks
      __init__.py
      test.py
    __init__.py
    models.py
    utils.py

app / api / log.py

from app import app
from app.models import Race, db
from app.utils  import * 

def historical_records():
    df_races, df_circuits, constructors, df_drivers, df_results = extract_to_df_race('results', seasons, races_round)
    # Check if row exists in table
    exists = db.session.query(db.exists().scalar())
    if exists is None:
        df_races, df_circuits, constructors, df_drivers, df_results = extract_to_df_race('results', seasons, races_round)
        save_races_to_db(df_races, db)
    else:
        print("The database already contains data of 2016 to current race")

def save_races_to_db(df_races, db):
    for idx,row in df_races.iterrows():
        r = Race()
        r.url = df_races.loc[idx,"url"]
        r.season = df_races.loc[idx,"season"]
        r.raceName = df_races.loc[idx,"raceName"]
        db.session.add(r)
        try:
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            print(str(e))


historical_records()

我激活了虚拟环境,然后执行python app/api/log.py,但遇到此错误:

  File "app/api/log.py", line 1, in <module>
    from app import app
ImportError: No module named app

是否通过运行export FLASK_APP=app/__init__.py然后运行flask run来初始化应用程序甚至加载数据库?

1 个答案:

答案 0 :(得分:4)

您的问题是,您正在使用包中的模块作为脚本;那时,顶级模块导入路径设置为app/api/目录。至少要以python -m app.api.log的身份运行它,以保持正确的上下文。

但是,您应该将脚本设置为Flask command,因为这会为您提供活动的应用程序上下文

使您的historical_records()函数成为命令:

import click

from app import app
from app.models import Race, db
from app.utils  import * 

@app.cli.command()
def historical_records():
    # your function

从模块末尾删除historical_records()调用。

然后您可以使用以下命令运行该命令

FLASK_APP=app flask historical_records

(您无需将/__init__.py添加到FLASK_APP

因为无法看到flask run__init__.py,所以我们无法告诉您db.py是否将加载数据库,也不知道您是否运行过{{1} }功能。