Шаг 3. Эксперимент, подразумевающий подключение к SQL с помощью pyodbc
В этом примере показано, как использовать pyodbc
концепцию для подключения к базе данных SQL. В этом примере предполагается, что вы используете образец базы данных AdventureWorksLT.
Примечание.
Этот пример следует рассматривать только как подтверждение концепции. Код в этом примере упрощен для удобочитаемости и для него не гарантируется соблюдение рекомендаций корпорации Майкрософт.
Необходимые компоненты
- Python 3
- Если у вас еще нет Python, установите диспетчер пакетов Python и диспетчер пакетов Python (PyPI) из python.org.
- Предпочитаете не использовать собственную среду? Откройте в качестве devcontainer с помощью GitHub Codespaces.
pyodbc
пакет из PyPI.- Установка драйвера Microsoft ODBC 18 для SQL Server
- База данных SQL и учетные данные.
Подключение и запрос данных
Подключитесь к базе данных с помощью учетных данных.
Создайте файл с именем app.py.
Добавление документации по модулю.
""" Connects to a SQL database using pyodbc """
Импортируйте пакет
pyodbc
.import pyodbc
Создайте переменные для учетных данных подключения.
SERVER = '<server-address>' DATABASE = '<database-name>' USERNAME = '<username>' PASSWORD = '<password>'
Создайте переменную строка подключения с помощью интерполяции строк.
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
Используйте функцию
pyodbc.connect
для подключения к базе данных SQL.conn = pyodbc.connect(connectionString)
Выполнение запроса
Используйте строку SQL-запроса для выполнения запроса и анализа результатов.
Создайте переменную для строки запроса SQL.
SQL_QUERY = """ SELECT TOP 5 c.CustomerID, c.CompanyName, COUNT(soh.SalesOrderID) AS OrderCount FROM SalesLT.Customer AS c LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.CompanyName ORDER BY OrderCount DESC; """
Используется
cursor.execute
для извлечения результирующих наборов из запроса к базе данных.cursor = conn.cursor() cursor.execute(SQL_QUERY)
Примечание.
Эта функция фактически принимает любой запрос и возвращает результирующий набор, по которому может быть выполнена итерация с использованием cursor.fetchone().
foreach
Используйтеcursor.fetchall
цикл для получения всех записей из базы данных. Затем распечатайте записи.records = cursor.fetchall() for r in records: print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
Сохраните файл app.py .
Откройте терминал и протестируйте приложение.
python app.py
29485 1 Professional Sales and Service 29531 1 Remarkable Bike Store 29546 1 Bulk Discount Store 29568 1 Coalition Bike Company 29584 1 Futuristic Bikes
Вставка строки в виде транзакции
В этом примере вы безопасно выполняете инструкцию INSERT
и передаете параметры. Передача параметров в качестве значений защищает приложение от атак внедрения SQL.
Импорт
randrange
из библиотекиrandom
.from random import randrange
Создайте случайный номер продукта.
productNumber = randrange(1000)
Совет
Создание случайного номера продукта здесь гарантирует, что этот пример можно запустить несколько раз.
Создайте строку инструкции SQL.
SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP) """
Выполните инструкцию с помощью
cursor.execute
.cursor.execute( SQL_STATEMENT, f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 )
Извлеките первый столбец одного результата,
cursor.fetchval
распечатайте уникальный идентификатор результата, а затем зафиксируйте операцию в виде транзакции с помощьюconnection.commit
.resultId = cursor.fetchval() print(f"Inserted Product ID : {resultId}") conn.commit()
Совет
При необходимости можно использовать
connection.rollback
для отката транзакции.Закройте курсор и подключение с помощью
cursor.close
иconnection.close
.cursor.close() conn.close()
Сохраните файл app.py и снова протестируйте приложение
python app.py
Inserted Product ID : 1001
Следующие шаги
Центр разработчиков Python.