#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 для обработки результатов в качестве словаря. Я считаю, что это легче обрабатывать. Хотя есть и другие способы сделать это.