Python Flask и SQLAlchemy, выбирая все данные из столбца - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь запросить все строки для столбца с именем show_id. Затем я хотел бы сравнить каждый потенциальный элемент, который будет добавлен в БД, с результатами. Теперь самый простой способ сделать это - проверить, присутствует ли каждое шоу в результатах. Если это так, пройдите и т. Д. Однако результаты из приведенного ниже фрагмента возвращаются как объекты. Так что эта проверка не проходит.

Есть ли лучший способ создать запрос для достижения этой цели?

shows_inDB = Show.query.filter(Show.show_id).all()
print(shows_inDB)

Результаты:

<app.models.user.Show object at 0x10c2c5fd0>, 
<app.models.user.Show object at 0x10c2da080>, 
<app.models.user.Show object at 0x10c2da0f0>

Код для всей функции:

def save_changes_show(show_details):
    """
    Save the changes to the database
    """  
    try:
        shows_inDB = Show.query.filter(Show.show_id).all()
        print(shows_inDB)

        for show in show_details:

            #Check the show isnt already in the DB
            if show['id'] in shows_inDB:
                print(str(show['id']) + ' Already Present')
            else:

                #Add show to DB
                tv_show = Show(
                    show_id = show['id'],
                    seriesName = str(show['seriesName']).encode(),
                    aliases = str(show['aliases']).encode(),
                    banner = str(show['banner']).encode(),
                    seriesId = str(show['seriesId']).encode(),
                    status = str(show['status']).encode(),
                    firstAired = str(show['firstAired']).encode(),
                    network = str(show['network']).encode(),
                    networkId = str(show['networkId']).encode(),
                    runtime = str(show['runtime']).encode(),
                    genre = str(show['genre']).encode(),
                    overview = str(show['overview']).encode(),
                    lastUpdated = str(show['lastUpdated']).encode(),
                    airsDayOfWeek = str(show['airsDayOfWeek']).encode(),
                    airsTime = str(show['airsTime']).encode(),
                    rating = str(show['rating']).encode(),
                    imdbId = str(show['imdbId']).encode(),
                    zap2itId = str(show['zap2itId']).encode(),
                    added = str(show['added']).encode(),
                    addedBy = str(show['addedBy']).encode(),
                    siteRating = str(show['siteRating']).encode(),
                    siteRatingCount = str(show['siteRatingCount']).encode(),
                    slug = str(show['slug']).encode()
                )
                db.session.add(tv_show)

                db.session.commit()
    except Exception:
        print(traceback.print_exc())

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Для запроса определенного значения столбца взгляните на этот вопрос: Запрос Flask SQLAlchemy, укажите имена столбцов . Вот пример кода, приведенный в верхнем ответе:

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

Суть вашей проблемы в том, что вы хотите создать новый Show экземпляр, если это шоу еще не существует в базе данных.

Запрос к базе данных для всех шоу и циклический просмотр результатов для каждого потенциального нового шоу может стать очень неэффективным, если в итоге вы получите много шоу в базе данных, а поиск по идентификатору - это то, что лучше всего делает СУБД!

Эта функция проверит, существует ли объект, и создаст его, если нет. Вдохновленный этим ответом :

def add_if_not_exists(model, **kwargs):
    if not model.query.filter_by(**kwargs).first():
        instance = model(**kwargs)
        db.session.add(instance)

Итак, ваш пример будет выглядеть так:

def add_if_not_exists(model, **kwargs):
    if not model.query.filter_by(**kwargs).first():
        instance = model(**kwargs)
        db.session.add(instance)

for show in show_details:
    add_if_not_exists(Show, id=show['id'])

Если вы действительно хотите запросить все показы заранее, вместо помещения всех идентификаторов в список, вы можете использовать набор вместо списка , что ускорит ваш тест включения.

например:

show_compare = {item.show_id for item in Show.query.all()}
for show in show_details:
   # ... same as your code
0 голосов
/ 06 января 2019

Я решил использовать описанный выше метод и извлечь нужные данные в список, сравнивая каждое шоу со списком.

show_compare = []
shows_inDB = Show.query.filter().all()
for item in shows_inDB:
   show_compare.append(item.show_id)


for show in show_details:
    #Check the show isnt already in the DB
    if show['id'] in show_compare:
        print(str(show['id']) + ' Already Present')
    else:
         #Add show to DB
...