curse.выполнить в инструкции if python

#python

#python

Вопрос:

У меня вопрос, возможно ли выполнить оператор if с помощью curse.execute в операторе if? Мне нужно получить номер по строкам, для этого мой код приведен ниже

 cursor.execute("SELECT COUNT(*) from test WHERE email = '{0}'".format(json.dumps(email)))
time_check = cursor.fetchone()[0]
 

итак, я получаю 16, он работает нормально, но мне нужно проверить время, например, 8
утра, это будет очень «жестко», если я буду делать много

    cursor.execute("SELECT COUNT(*) from test WHERE time='8:00:00.000' and email = '{0}'".format(json.dumps(email)))
    time_check1 = cursor.fetchone()[0]
   cursor.execute("SELECT COUNT(*) from test WHERE time='8:30:00.000' and email = '{0}'".format(json.dumps(email)))
    time_check2 = cursor.fetchone()[0]
 

итак, я хочу поместить что в оператор if, и у меня проблема с тем, как это сделать в cursor.fetchone функции оператора if с curse.execute помощью?
функция оператора if проверяет, существует ли в какое время менее двух строк.
Я не хочу делать так

 if (time_check1  < 2)
{
} 
 

Я хочу сделать что-то вроде этого

 if (cursor.execute("SELECT COUNT(*) from test WHERE time='8:30:00.000' and email = '{0}'".format(json.dumps(email)))< 2)
{
} 
 

Я использую python и это в проекте flask.
Есть идеи, как это решить? или что-то еще, как это проверить?

Комментарии:

1. Я собираюсь сообщить вам прямо сейчас, что это вообще плохая идея. Отладка будет настоящей болью, если что-то не сработает

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

Ответ №1:

Возможно, один из способов решить эту проблему — использовать функцию

 def execute_and_fetch_one(cursor, statement):
    cursor.execute(statement)
    return cursor.fetchone()[0]
 

Затем вы можете вызвать его внутри инструкции if

 if (execute_and_fetch_one(cursor, "SELECT COUNT(*) from test WHERE time='8:30:00.000' and email = '{0}'".format(json.dumps(email))) < 2)
 

В любом случае, вы обычно не должны использовать .format для форматирования ваших SQL-запросов, поскольку это подвержено SQL-инъекциям, найдите в Интернете альтернативный способ для этого с используемым пакетом

Ответ №2:

Обычно вы не хотите помещать выполнение запроса в инструкцию if. Это может привести к проблемам позже, когда вам нужно будет устранить неполадки. Создайте общую функцию, которая будет обрабатывать ваши выполнения. Вы можете создать единственную функцию, которая обрабатывает execute , fetch_all, fetch_one и т. Д. Или вы можете создать несколько функций и обрабатывать результаты на основе того, что вам нужно.

В зависимости от того, что представляет собой ваша база данных, вы можете сделать что-то вроде этого (mysql в качестве примера):

Пример псевдокода (обратите внимание на использование DictCursor):

 import pymysql

def fetch_one(sql):
    conn = pymysql.connect(host=host, user=user, passwd=password, db=database)
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute(sql)
    ret_ = cursor.fetchone()
    cursor.close()
    conn.close()

    return ret_
 

Затем вы можете создать оператор, подобный этому:

 sql = "SELECT count(*) as 'count' from [table] where [...]"

ret_ = fetch_one(sql)

print(ret_['count'])
 

Затем вы можете обработать результаты. Я лично использую DictCursor для обработки результатов в качестве словаря. Я считаю, что это легче обрабатывать. Хотя есть и другие способы сделать это.