Как передать аргумент диапазона дат в запросе SQL с помощью argparse Python

У меня есть 3 аргумента: дата, имя и страна, этот код позволяет передать мои необязательные аргументы для моего SQL-запроса, например:

import argparse
parser = argparse.ArgumentParser()

# provide a clear definition of possible arguments
parser.add_argument('--date', type=str, required=False, default=None)
parser.add_argument('--Name', type=str, required=False, default=None)
parser.add_argument('--country', type=str, required=False, default=None)

# get arguments passed in
args = parser.parse_args()

args = args.__dict__

# form statement based on arguments that were given
columns = ' and '.join([x+'=%s' for x in args if args[x]])     #check that args[x] is not None

vars = tuple([args[x] for x in args if args[x]])

statement = "SELECT * FROM TABLE WHERE "+columns

cursor.execute(statement, vars)

Мой SQL-запрос:

'SELECT * FROM TABLE WHERE date=%s and name=%s'

Я хочу назвать свой скрипт следующим образом:

script.py --date=var1 --name=var3

Теперь, если у меня есть диапазон дат, как я могу добавить этот аргумент с закрытием between в свой SQL, чтобы получить такой запрос:

'SELECT * FROM TABLE WHERE date between %s and %s and name=%s'

Как я могу это сделать, пожалуйста

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
644
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, это то, что вы ищете:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--date", nargs=2)
parser.add_argument("--name")
parser.add_argument("--country")

# Use `vars` to get a dict of arguments
args = vars(parser.parse_args())
# Only keep arguments that aren't `None`
args = {k: v for k, v in args.items() if v is not None}

# Base select statement
statement = "SELECT * FROM TABLE"

# This list will hold all the extra conditionals
operators = []

if "date" in args:
    # Specifically parse the dates and then delete it from args
    operators.append("date BETWEEN {} AND {}".format(*args["date"]))
    del args["date"]

# For the remaining args add them to operators
for k, v in args.items():
    operators.append("{} = {}".format(k, v))

if operators:
    # If there are extra operators add them to the base statement
    statement = statement + " WHERE " + " and ".join(operators)
print(statement)

Что я сделал здесь:

  • Укажите количество --date аргументов, используя nargs=2
  • Использовал vars, чтобы получить словарь вместо args.__dict__
  • Добавлен специальный чек для date
  • Использовал цикл for для добавления других необязательных аргументов

Вы можете увидеть некоторые примеры результатов ниже:

python3 script.py --date 2020-08-01 2020-12-25 --name alex --country Canada
SELECT * FROM TABLE WHERE date BETWEEN 2020-08-01 AND 2020-12-25 and name=alex and country=Canada

python3 script.py --date 2020-08-01 2020-12-25 --name alex
SELECT * FROM TABLE WHERE date BETWEEN 2020-08-01 AND 2020-12-25 and name=alex

python3 script.py --name alex
SELECT * FROM TABLE WHERE name=alex

python3 script.py
SELECT * FROM TABLE

Это возвращается SELECT * FROM TABLE WHERE date BETWEEN 2020-03-01 AND 2020-03-02 and country=USA

Alex 11.12.2020 10:31

Другие вопросы по теме