#python #postgresql #arguments #argparse
#python #postgresql #аргументы #argparse
Вопрос:
У меня есть 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 qyery :
'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'
Как я могу это сделать, пожалуйста
Ответ №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
для получения dict вместо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
Комментарии:
1. Это возвращает
SELECT * FROM TABLE WHERE date BETWEEN 2020-03-01 AND 2020-03-02 and country=USA