Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

usando sql server no django em setting, sem ser no default sqlite3

estou tendando usar um projeto em django que vai acessar tabelas já criadas num banco em sql server e que já estão populadas e no setting onde existe o local de DATABASE tentei colocar propriedades da conexão, que consigo fazer em java jsf com o persistence.xml e jodbc. mas no django está dando erro. django.db.utils.OperationalError: ('08001', '[08001] [Microsoft][ODBC Driver 18 for SQL Server]Provedor SSL: A cadeia de certificação foi emitida por uma autoridade que não é de confiança.\r\n (-2146893019) (SQLDriverConnect); [08001] [Microsoft][ODBC Driver 18 for SQL Server]Atributo de cadeia de conexão inválido (0); [08001] [Microsoft][ODBC Driver 18 for SQL Server]Cliente incapaz de estabelecer conexão. Para soluções relacionadas a erros de criptografia, veja https://go.microsoft.com/fwlink/?linkid=2226722 (-2146893019)')

no meu setting está: DATABASES= { 'default': { 'ENGINE': 'sql_server.pyodbc', # ou outro motor específico do adaptador 'NAME': 'xxxxlDB', 'HOST': '10.1xxx.xxx', 'USER': 'xxxxx', 'PASSWORD': 'xxxx', 'PORT': '1433', # Porta padrão do SQL Server 'TRUSTSERVERCERTIFICATE': 'yes' , 'OPTIONS': { 'driver': 'ODBC Driver 18 for SQL Server', # Substitua pelo driver instalado } } }

Consigo fazer conexão colocando como string de conexão dentro de uma view, porém se não for no setting entendo que perco a maneira de fazer templates baseados em views que fiz o crud. mas em sqlite3.

Alguém pode me ajudar ?

2 respostas

Oi Sérgio!

Pelo erro que você está enfrentando, parece que o Django está tendo dificuldades com a conexão SSL do SQL Server. O erro específico aponta que a cadeia de certificação não é confiável. Vamos tentar resolver isso!

Você já está no caminho certo, configurando a conexão no DATABASES no settings.py, mas o erro de SSL que aparece indica que o certificado do servidor SQL não está sendo aceito, o que é comum quando não há uma autoridade de certificação (CA) confiável no seu ambiente.

Tente os seguintes ajustes:

  1. Adicionar a opção ENCRYPT no OPTIONS:

    Adicionar o parâmetro ENCRYPT como yes pode ajudar o Django a entender que deve forçar uma conexão segura e, ao mesmo tempo, permitir que o certificado não confiável seja aceito. Assim, no seu settings.py, a parte da conexão ficaria assim:

    DATABASES = {
        'default': {
            'ENGINE': 'sql_server.pyodbc',
            'NAME': 'xxxxlDB',
            'HOST': '10.1.xxx.xxx',
            'USER': 'xxxxx',
            'PASSWORD': 'xxxx',
            'PORT': '1433',
            'OPTIONS': {
                'driver': 'ODBC Driver 18 for SQL Server',  # Substitua pelo driver instalado
                'extra_params': 'TrustServerCertificate=yes;Encrypt=yes;',
            },
        }
    }
    
  2. Verifique a versão do ODBC Driver:

    Certifique-se de que o driver ODBC esteja corretamente instalado e configurado. No seu caso, você mencionou o "ODBC Driver 18 for SQL Server", que é a versão mais recente, mas dependendo do seu ambiente, talvez seja necessário utilizar a versão 17. Tente ajustar a versão do driver, se necessário.

  3. Testar a conexão localmente:

    Para garantir que a configuração está correta, você pode tentar a conexão diretamente em um ambiente de teste, fora do Django, apenas usando o Python. Exemplo:

    import pyodbc
    
    conn = pyodbc.connect('DRIVER={ODBC Driver 18 for SQL Server};'
                          'SERVER=10.1.xxx.xxx;'
                          'DATABASE=xxxxlDB;'
                          'UID=xxxxx;'
                          'PWD=xxxx;'
                          'TrustServerCertificate=yes;Encrypt=yes;')
    
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM sua_tabela')
    rows = cursor.fetchall()
    for row in rows:
        print(row)
    

    Isso ajuda a testar a conexão fora do Django e isolar problemas com o driver ou com a configuração do banco.

  4. Certificados de segurança:

    Se você estiver em um ambiente onde o SQL Server está configurado para exigir um certificado de segurança específico, você pode precisar baixar o certificado da autoridade de certificação e configurá-lo adequadamente no seu sistema.

Depois de ajustar isso, reinicie o servidor do Django e veja se a conexão é estabelecida corretamente.

Se ainda assim não funcionar, pode ser interessante revisar a documentação do sql_server.pyodbc para ver se há outras opções específicas para a sua versão do SQL Server.

Espero que isso ajude! Qualquer coisa, só chamar!

solução!

Felipe, funcionou, fiz o teste e trouxe os dados de minha tabela. Estou recuperando o projeto que já tinha feito o crud com models baseados em views, porem com o sqlite3, e antes de fazer o teste troquei no settings.py pro sql server , e quando fui fazer o migrate começou a dar problemas. Mas acho que recriando e trocando pro sql server vai realizar , deve dar problemas com dados gerados no banco interno e setado o admin. Obrigado, espero começar a ajudar aqui e conseguir gerar meu app em django que faz uso da ciencia de dados python e compara anexos legais da contabilidade pública, gerando um grande painel de acertos de nossos dados do sistema que trabalhamos de orcamento de prefeituras.