Created
June 17, 2020 15:48
-
-
Save PJCAfonso/f15b3e0040cf9702b5cc454d4d082b07 to your computer and use it in GitHub Desktop.
Exemplo de CRUD com SQLAlchemy e MS SQL Server.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
"""Exemplo de CRUD com SQLAlchemy e MS SQL Server. | |
Em caso de problemas na instalação com ``pip install pyodbc`` | |
pode-se utilizar: `pyodbc <https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyodbc>`_ | |
Além do conector é necessária a instalação do driver do SQL Server: | |
- `Windows <https://docs.microsoft.com/pt-br/sql/connect/odbc/windows/system-requirements-installation-and-driver-files?view=sql-server-2017#installing-microsoft-odbc-driver-for-sql-server>`_. | |
- `Linux/macOS <https://docs.microsoft.com/pt-br/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017>`_. | |
Código testado com: | |
- Windows Server 2016 + SQL Server 2016. | |
- Ubuntu server 18.04 + Docker. | |
""" | |
import pyodbc | |
from urllib.parse import quote_plus | |
from sqlalchemy import Column, Integer, String, create_engine | |
from sqlalchemy.ext.declarative import declarative_base | |
from sqlalchemy.orm import sessionmaker | |
# String de conexão Windows Server. | |
parametros = ( | |
# Driver que será utilizado na conexão | |
'DRIVER={ODBC Driver 17 for SQL Server};' | |
# IP ou nome do servidor\Versão do SQL. | |
'SERVER=192.168.100.178\SQLEXPRESS;' | |
# Porta | |
'PORT=1433;' | |
# Banco que será utilizado. | |
'DATABASE=PythonMSSQL;' | |
# Nome de usuário. | |
'UID=python;' | |
# Senha. | |
'PWD=123456') | |
# String de conexão Docker imagem Linux. | |
# parametros = ( | |
# # Driver que será utilizado na conexão | |
# 'DRIVER={ODBC Driver 17 for SQL Server};' | |
# # IP ou nome do servidor\ | |
# 'SERVER=192.168.100.118;' | |
# # Porta | |
# 'PORT=1433;' | |
# # Banco que será utilizado (Criar banco). | |
# 'DATABASE=PythonMSSQL;' | |
# # Nome de usuário (Usuário default da imagem Docker). | |
# 'UID=SA;' | |
# # Senha. | |
# 'PWD=Python.123456') | |
# Convertendo a string para um padrão de URI HTML. | |
url_db = quote_plus(parametros) | |
# Conexão. | |
# Para debug utilizar echo=True | |
engine = create_engine('mssql+pyodbc:///?odbc_connect=%s' % url_db) | |
# Criando uma classe "Session" já configurada. | |
# Session é instanciado posteriormente para interação com a tabela. | |
Session = sessionmaker(bind=engine) | |
Base = declarative_base() | |
class NomeDaTabela(Base): | |
"""Cada classe representa uma tabela do banco""" | |
# Nome da tabela, se a variável não for | |
# declarada será utilizado o nome da classe. | |
__tablename__ = 'NomeDaTabela' | |
# Colunas da tabela. | |
id = Column(Integer, primary_key=True) | |
nome = Column('nome', String(32)) | |
idade = Column('idade', Integer) | |
sexo = Column('sexo', String(10)) | |
def __init__(self, nome, idade, sexo): | |
"""Construtor. | |
Utilizando o construtor para passar os valores | |
no momento em que a classe é instanciada. | |
:param nome: (str). | |
:param idade: (int). | |
:param sexo: (str). | |
""" | |
self.nome = nome | |
self.idade = idade | |
self.sexo = sexo | |
if __name__ == "__main__": | |
# Verificando se o driver do MS SQL Server está instalado. ODBC Driver 17 for SQL Server | |
print([x for x in pyodbc.drivers() if x.startswith('ODBC Driver 17 for SQL Server')]) | |
# Removendo todas as tabelas do banco. | |
# Base.metadata.drop_all(engine) | |
# Criando todas as tabelas. | |
Base.metadata.create_all(engine) | |
# Criando uma sessão (add, commit, query, etc). | |
session = Session() | |
# Criando os dados que serão inseridos na tabela. | |
# Classe com o construtor. | |
# usuario = NomeDaTabela('Felipe', 35, 'Masculino') | |
# usuarios = [NomeDaTabela('Maria', 20, 'Feminino'), NomeDaTabela('Pedro', 50, 'Masculino')] | |
# Caso não seja utilizado o construtor na classe | |
# os dados são passados depois de se criar a instancia. | |
# usuario = NomeDaTabela() | |
# usuario.nome = 'Camila' | |
# usuario.idade = 50 | |
# usuario.sexo = 'Feminino' | |
# Inserindo registro na tabela. | |
# session.add(usuario) | |
# Inserindo vários registros na tabela. | |
# session.add_all(usuarios) | |
# Persistindo os dados. | |
# session.commit() | |
# Consultar todos os registros. | |
# dados = session.query(NomeDaTabela).all() | |
# print(dados) | |
# for linha in dados: | |
# print(f'Nome: {linha.nome} - Idade: {linha.idade} - Sexo: {linha.sexo}') | |
# Consulta registros com filtro. | |
# dados = session.query(NomeDaTabela).filter(NomeDaTabela.idade > 40).all() | |
# print(dados) | |
# for linha in dados: | |
# print(f'Nome: {linha.nome} - Idade: {linha.idade} - Sexo: {linha.sexo}') | |
# Alterar um registro da tabela. | |
# print('Nome ANTES da alteração:', session.query(NomeDaTabela).filter(NomeDaTabela.id == 1).one().nome) | |
# session.query(NomeDaTabela).filter(NomeDaTabela.id == 1).update({'nome': 'Roberto'}) | |
# session.commit() | |
# print('Nome DEPOIS da alteração:', session.query(NomeDaTabela).filter(NomeDaTabela.id == 1).one().nome) | |
# Remover um registro da tabela. | |
# print('Registro ANTES da remoção:', session.query(NomeDaTabela).filter(NomeDaTabela.id == 1).one_or_none()) | |
# session.query(NomeDaTabela).filter(NomeDaTabela.id == 1).delete() | |
# session.commit() | |
# print('Registro DEPOIS da remoção:', session.query(NomeDaTabela).filter(NomeDaTabela.id == 1).one_or_none()) | |
# Fechando a sessão. | |
session.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment