Etapa 3: Prova de conceito da conexão ao SQL usando pyodbc
Este exemplo de prova de conceito é usado pyodbc
para se conectar a um banco de dados SQL. Este exemplo pressupõe que você esteja usando o banco de dados de exemplo AdventureWorksLT.
Observação
Este exemplo só deve ser considerado como uma prova de conceito. O código de exemplo está simplificado para fins de clareza e não necessariamente representa as melhores práticas recomendadas pela Microsoft.
Pré-requisitos
- Python 3
- Se você ainda não possui o Python, instale o runtime do Python e o gerenciador de pacotes Índice de Pacotes do Python (PyPI) de python.org.
- Prefere não usar seu próprio ambiente? Abra como um devcontainer usando o GitHub Codespaces.
- Pacote
pyodbc
do PyPI. - Instale o Microsoft ODBC Driver 18 para SQL Server
- Um banco de dados SQL e credenciais.
Conectar e pesquisar dados
Conecte-se a um banco de dados usando suas credenciais.
Crie um novo arquivo chamado app.py.
Adicione um módulo docstring.
""" Connects to a SQL database using pyodbc """
Importar o pacote
pyodbc
.import pyodbc
Crie variáveis para suas credenciais de conexão.
SERVER = '<server-address>' DATABASE = '<database-name>' USERNAME = '<username>' PASSWORD = '<password>'
Crie uma variável de cadeia de conexão usando interpolação de cadeia de caracteres.
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
Use a
pyodbc.connect
função para se conectar a um banco de dados SQL.conn = pyodbc.connect(connectionString)
Executar uma consulta
Use uma cadeia de caracteres de consulta SQL para executar uma consulta e analisar os resultados.
Crie uma variável para a cadeia de caracteres de consulta 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; """
Use
cursor.execute
para recuperar um conjunto de resultados de uma consulta em relação ao banco de dados.cursor = conn.cursor() cursor.execute(SQL_QUERY)
Observação
Essencialmente, essa função aceita qualquer consulta e retorna um conjunto de resultados que pode ser iterado com o uso de cursor.fetchone().
Use
cursor.fetchall
com um loopforeach
para obter todos os registros do banco de dados. Em seguida, imprima os registros.records = cursor.fetchall() for r in records: print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
Salve o arquivo app.py.
Abra um terminal e teste o aplicativo.
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
Inserir uma linha como uma transação
Neste exemplo, você verá como executar uma instrução INSERT
com segurança e passar parâmetros. Passar parâmetros como valores protege seu aplicativo contra ataques de injeção de SQL.
Importe
randrange
da bibliotecarandom
.from random import randrange
Gere um número de produto aleatório.
productNumber = randrange(1000)
Dica
Gerar um número de produto aleatório aqui garante que você possa executar essa amostra várias vezes.
Crie uma cadeia de caracteres de instrução SQL.
SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP) """
Execute a instrução usando
cursor.execute
.cursor.execute( SQL_STATEMENT, f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 )
Busque a primeira coluna do resultado único usando
cursor.fetchval
, imprima o identificador exclusivo do resultado e confirme a operação como uma transação usandoconnection.commit
.resultId = cursor.fetchval() print(f"Inserted Product ID : {resultId}") conn.commit()
Dica
Opcionalmente, você pode usar
connection.rollback
para reverter a transação.Feche o cursor e a conexão usando
cursor.close
econnection.close
.cursor.close() conn.close()
Salve o arquivo app.py e teste o aplicativo novamente
python app.py
Inserted Product ID : 1001