В последнее время я заинтересовался этим и поиграл с печально известным образцом службы Northwind, и, хотя есть несколько пакетов python, которые я хотел попробовать, сначала я подумал, что увижу, как далеко я могу добраться только с помощью запросов и встроенного python. .
Вы можете видеть, что форматирование строк URL так же просто, как говорит Hoang HUA, - и я даже не использую «полную силу» команд, доступных с запросами [Примечание: манипуляции с таблицей выполняются на стороне клиента и этот код грубой силы все еще очень короткий]:
import requests
import operator
def make_HTTP_request(url):
r = requests.get(url)
return r.json()
srvc_root = 'https://services.odata.org/V4/Northwind/Northwind.svc'
order_date = '1998-01-01T00:00:00Z'
filter = '$filter=OrderDate gt {} and RequiredDate lt ShippedDate'.format(order_date)
orders_qry = '$select=OrderID,CustomerID,EmployeeID&{}'.format(filter)
url_orders_qry = '{}/Orders?{}'.format(srvc_root, orders_qry)
urldict_orders = make_HTTP_request(url_orders_qry)
customerIDs = []
employeeIDs = []
for order in urldict_orders['value']:
customerIDs.append(order['CustomerID'])
employeeIDs.append(str(order['EmployeeID']))
customer_qry = '$select={}&$filter=CustomerID eq \'{}\''.format('CustomerID,CompanyName', '\' or CustomerID eq \''.join(customerIDs))
url_customers_qry = '{}/Customers?{}'.format(srvc_root, customer_qry)
urldict_customers = make_HTTP_request(url_customers_qry)
employee_qry = '$select={}&$filter=EmployeeID eq {}'.format('EmployeeID,FirstName,LastName', ' or EmployeeID eq '.join(employeeIDs))
url_employees_qry = '{}/Employees?{}'.format(srvc_root, employee_qry)
urldict_employees = make_HTTP_request(url_employees_qry)
dict_customers = {}
dict_employees = {}
dict_orders = {}
for cust in urldict_customers['value']:
dict_customers[cust['CustomerID']] = cust['CompanyName']
for emp in urldict_employees['value']:
dict_employees[emp['EmployeeID']] = '{} {}'.format(emp['FirstName'], emp['LastName'])
for order in urldict_orders['value']:
dict_orders[order['OrderID']] = (dict_customers[order['CustomerID']], dict_employees[order['EmployeeID']])
for orders in sorted(dict_orders.items(), key=operator.itemgetter(1)):
print('{0:7d} {1:30s}{2:30s}'.format(orders[0], orders[1][0], orders[1][1]))
Это вывод - 8 строк (кортежей) из 3 столбцов (атрибутов) в 3 таблицах (объектах):
10924 Berglunds snabbköp Janet Leverling
10827 Bon app' Nancy Davolio
10970 Bólido Comidas preparadas Anne Dodsworth
10816 Great Lakes Food Market Margaret Peacock
10960 HILARION-Abastos Janet Leverling
10927 La corne d'abondance Margaret Peacock
10828 Rancho grande Anne Dodsworth
10847 Save-a-lot Markets Margaret Peacock
Кстати, при выполнении в локальной базе данных PostgreSQL копии Northwind это эквивалентный SQL:
SELECT
O.order_id, C.company_name,
E.first_name || ' ' || E.last_name AS Employee
FROM
orders O JOIN employees E ON O.employee_id = E.employee_id
JOIN customers C ON O.customer_id = C.customer_id
WHERE
O.order_date > '1998-01-01' AND O.shipped_date > O.required_date
ORDER BY
C.company_name;