Python Flask:保存请求。将API数据获取到sqlite数据库

Python Flask:保存请求。将API数据获取到sqlite数据库,python,flask,sqlalchemy,python-requests,Python,Flask,Sqlalchemy,Python Requests,我尝试将获取的API数据保存到Flask应用程序中的sqlite数据库,但未成功。我使用requests.get()将外部API数据提取到dataframe当我在Jupyter笔记本中测试“extract_to_df_race”功能时,该功能可以正常工作。我放置了try-except语句以将错误消息打印到控制台。由于控制台中并没有记录错误消息,所以我最初假定数据已成功获取并保存到数据库。但是,在检查数据库时,没有保存任何记录 我使用了一个定制的Flask命令来执行“historical_reco

我尝试将获取的API数据保存到Flask应用程序中的sqlite数据库,但未成功。我使用requests.get()将外部API数据提取到dataframe当我在Jupyter笔记本中测试“extract_to_df_race”功能时,该功能可以正常工作。我放置了try-except语句以将错误消息打印到控制台。由于控制台中并没有记录错误消息,所以我最初假定数据已成功获取并保存到数据库。但是,在检查数据库时,没有保存任何记录

我使用了一个定制的Flask命令来执行“historical_records”函数,一次性加载数据库

有没有更好的调试方法可以尝试

app/api/log.py

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

@app.cli.command()
def historical_records():
    seasons = [2015]
    races_round = range(1,5)
    df_races = extract_to_df_race('results', seasons, races_round)
    save_races_to_db(df_races, db)

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()
            eprint(str(e))
from __future__ import print_function
import requests
import json
import pandas as pd
import datetime
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

def extract_to_df_race(results_type, seasons, races_round):

    df_races = pd.DataFrame()

    if results_type == 'results':   
        for s in seasons:
            for r in races_round:
                try:
                    response = requests.get(API_URL)
                    response.raise_for_status()
                    dictionary = response.content 
                    dictionary = json.loads(dictionary)
                    races = transform_func(dictionary, s, r) 
                    df_races = pd.concat([df_races, races])
                except requests.exceptions.HTTPError as err:
                    eprint(err)
                    sys.exit(1)


        return df_races
为了从虚拟环境中执行历史记录功能,我运行了
“export FLASK\u APP=APP/api/log.py”
,然后运行
“FLASK historical\u records”

app/utils.py

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

@app.cli.command()
def historical_records():
    seasons = [2015]
    races_round = range(1,5)
    df_races = extract_to_df_race('results', seasons, races_round)
    save_races_to_db(df_races, db)

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()
            eprint(str(e))
from __future__ import print_function
import requests
import json
import pandas as pd
import datetime
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

def extract_to_df_race(results_type, seasons, races_round):

    df_races = pd.DataFrame()

    if results_type == 'results':   
        for s in seasons:
            for r in races_round:
                try:
                    response = requests.get(API_URL)
                    response.raise_for_status()
                    dictionary = response.content 
                    dictionary = json.loads(dictionary)
                    races = transform_func(dictionary, s, r) 
                    df_races = pd.concat([df_races, races])
                except requests.exceptions.HTTPError as err:
                    eprint(err)
                    sys.exit(1)


        return df_races
比赛模式

class Race(db.Model, Serializer):
    __tablename__ = 'races'
    raceId = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.String(50), unique=True)
    season = db.Column(db.Integer)
    raceName = db.Column(db.String(50))

    def __init__(self, **kwargs):
        super(Race, self).__init__(**kwargs)

您能展示一下比赛模型吗?另外,当您试图捕捉基于sqlalchemy的异常时,请始终指定您想要捕捉的异常。有关可用访问的列表:。也就是说,要捕获唯一的违规行为,请使用
IntegrityError
。此外,您不需要在日志中导入
eprint
提取到df\u race
。py@needtobe更新。eprint和extract_to_df_race在utils中找到,我已经将其导入log.py