Flask + sqlalchemy: загрузить базу данных с записями, запустив скрипт python

Я пытаюсь загрузить свою базу данных ОДНАЖДЫ с помощью 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

приложение / 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 даже базу данных?

Ваше приложение не является файлом Python, как вы могли его импортировать. Вы можете попробовать что-нибудь вроде from ... import models и удалить этот from app import app.

MT-FreeHK 16.08.2018 05:28

Что в вашем файле __init__.py?

Luis Orduz 16.08.2018 18:38
db.session.query(db.exists().scalar()) либо выходит из строя с ошибкой, либо проверяет, существует ли NULL (не в состоянии точно проверить, какой из двух), и не является полезной проверкой. Это просто пустой оператор EXISTS.
Martijn Pieters 19.08.2018 15:45
4
3
1 204
1

Ответы 1

Ваша проблема в том, что вы используете модуль внутри пакета в качестве сценария; в этот момент путь импорта модуля верхнего уровня устанавливается в каталог app/api/. По крайней мере, вы должны запускать его как python -m app.api.log, чтобы сохранить правильный контекст.

Однако вместо этого вы должны сделать свой сценарий Команда Flask, потому что это дает вам активный контекст приложения.

Сделайте свой 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, и я не знаю, выполняли ли вы функцию create_all().

Другие вопросы по теме