Я пытаюсь загрузить свою базу данных ОДНАЖДЫ с помощью 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
даже базу данных?
Что в вашем файле __init__.py
?
db.session.query(db.exists().scalar())
либо выходит из строя с ошибкой, либо проверяет, существует ли NULL
(не в состоянии точно проверить, какой из двух), и не является полезной проверкой. Это просто пустой оператор EXISTS
.
Ваша проблема в том, что вы используете модуль внутри пакета в качестве сценария; в этот момент путь импорта модуля верхнего уровня устанавливается в каталог 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()
.
Ваше приложение не является файлом Python, как вы могли его импортировать. Вы можете попробовать что-нибудь вроде
from ... import models
и удалить этотfrom app import app
.