source

Windows 인증을 사용하여 SQL 연금술을 통해 SQL Server에 연결하는 방법은 무엇입니까?

manycodes 2023. 7. 5. 20:50
반응형

Windows 인증을 사용하여 SQL 연금술을 통해 SQL Server에 연결하는 방법은 무엇입니까?

Python용 db 연결 모듈인 sqlalchemy는 기본적으로 SQL 인증(데이터베이스 정의 사용자 계정)을 사용합니다.윈도우즈(도메인 또는 로컬) 자격 증명을 사용하여 SQL 서버에 인증하려면 연결 문자열을 변경해야 합니다.

sqlalchemy에서 정의한 대로 기본적으로 SQL 서버에 연결하기 위한 연결 문자열은 다음과 같습니다.

sqlalchemy.create_engine('mssql://*username*:*password*@*server_name*/*database_name*')

Windows 자격 증명을 사용하여 사용할 경우 다음과 유사한 오류가 발생합니다.

sqlalchemy.exc.DBAPIError: (Error) ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for us
er '***S\\username'. (18456)") None None

이 오류 메시지에서 코드 18456은 SQL Server 자체에서 발생한 오류 메시지를 식별합니다.이 오류는 자격 증명이 잘못되었음을 나타냅니다.

sqlalchemy 및 mssql과 함께 윈도우즈 인증을 사용하려면 다음 연결 문자열이 필요합니다.

ODBC 드라이버:

engine = sqlalchemy.create_engine('mssql://*server_name*/*database_name*?trusted_connection=yes')

SQL Express 인스턴스:

engine = sqlalchemy.create_engine('mssql://*server_name*\\SQLEXPRESS/*database_name*?trusted_connection=yes') 

업데이트:

@DoloMike는 이전에 제공된 솔루션이 오래되어 예상대로 작동하지 않을 수 있음을 알게 되었습니다.다음은 그의 의견을 바탕으로 수정된 솔루션입니다.

engine = create_engine('mssql+pyodbc://@' + servername + '/' + dbname + '?trusted_connection=yes&driver=ODBC+Driver+13+for+SQL+Server')

설치된 SQL 서버에 따라 ODBC 드라이버 버전을 조정합니다.

신뢰할 수 있는 연결/AD를 사용하고 사용자 이름/암호를 사용하지 않는 경우 다음을 참조하십시오.

SAWarning: 드라이버 이름이 지정되지 않았습니다. >DSN이 없는 연결을 사용할 때 PyODBC가 이를 예상합니다. "드라이버 이름이 지정되지 않았습니다."

그런 다음 이 방법이 작동합니다.

from sqlalchemy import create_engine

server = <your_server_name>

database = <your_database_name>

engine = create_engine('mssql+pyodbc://' + server + '/' + database + '?trusted_connection=yes&driver=ODBC+Driver+13+for+SQL+Server')

Windows에서 로그온한 사용자가 아닌 다른 사용자로부터 MSSQL DB에 연결하려는 경우 가장 최근의 응답입니다.FreeTDS가 설치된 Linux 시스템에서 연결하는 경우에도 작동합니다.

다음은 Python 3.6 및 3.7을 사용하는 Windows 10 및 Ubuntu 18.04에서 모두 작동했습니다.

import getpass
from sqlalchemy import create_engine
password = getpass.getpass()
eng_str = fr'mssql+pymssql://{domain}\{username}:{password}@{hostip}/{db}'
engine = create_engine(eng_str)

된 것은 Windows 경를것 Windows 입니다.domain 앞에\usernamepymssql꾸러미

URL SqlAlchemy 결 URL
Connection String Pyodbc 파일 이름
OR 알려진 연결 매개 변수

저는 다른 모든 답변이 교육적이라는 것을 알았고, 연결 문자열에 있는 SQLAlchemyDocs도 도움이 된다는 것을 알았지만, 사용자 이름이나 암호를 사용하지 않고 trusted_connection='yes'(현재 개발 중)를 사용하는 MS SQL Server Express 19에 계속 연결하지 못했습니다.

그런 다음 저는 이 방법을 pyodbc 연결 문자열(또는 단순히 연결 문자열)로 구성된 SqlAlchemyDocson Connection URL에서 찾았습니다. 이는 알려진 연결 매개 변수(즉, 단순히 pyodbc에서 반드시 사용되지 않는 연결 문자열로 생각할 수 있습니다.제 pyodbc 연결 끈이 작동한다는 것을 알았기 때문에, 이것은 저에게 작동할 것처럼 보였고, 작동했습니다!

이 메서드는 SqlAlchemy create_engine 메서드에 제공되는 올바른 형식을 만드는 것에서 추측을 배제합니다.연결 매개 변수를 알고 있는 경우 아래 코드에 예시된 문서에 따라 연결 매개 변수를 단순 문자열로 입력하면 sqlalchemy.engine 모듈의 URL 클래스에 있는 생성 방법이 올바른 형식을 제공합니다.

아래 예제 코드는 그대로 실행되며 master라는 이름의 데이터베이스와 table_one이라는 이름의 기존 테이블을 아래 스키마로 가정합니다.또한, 저는 판다를 사용하여 테이블 데이터를 가져오고 있습니다.그렇지 않으면 컨텍스트 관리자를 사용하여 데이터베이스에 연결한 다음 SqlAlchemy 문서의 HERE와 같이 연결을 닫는 것을 관리하고 싶습니다.

import pandas as pd
import sqlalchemy
from sqlalchemy.engine import URL

# table_one dictionary:
table_one = {'name': 'table_one',
    'columns': ['ident int IDENTITY(1,1) PRIMARY KEY',
        'value_1 int NOT NULL',
        'value_2 int NOT NULL']}

# pyodbc stuff for MS SQL Server Express
driver='{SQL Server}'
server='localhost\SQLEXPRESS'
database='master'
trusted_connection='yes'

# pyodbc connection string
connection_string = f'DRIVER={driver};SERVER={server};'
connection_string += f'DATABASE={database};'
connection_string += f'TRUSTED_CONNECTION={trusted_connection}'

# create sqlalchemy engine connection URL
connection_url = URL.create(
    "mssql+pyodbc", query={"odbc_connect": connection_string})

""" more code not shown that uses pyodbc without sqlalchemy """

engine = sqlalchemy.create_engine(connection_url)

d = {'value_1': [1, 2], 'value_2': [3, 4]}
df = pd.DataFrame(data=d)

df.to_sql('table_one', engine, if_exists="append", index=False)

갱신하다

Linux 시스템에 SQL Server Express를 설치했다고 가정해 보겠습니다.다음 명령을 사용하여 올바른 문자열을 사용하고 있는지 확인할 수 있습니다.

  1. 드라이버:odbcinst -q -d
  2. 서버의 경우:sqlcmd -S localhost -U <username> -P <password> -Q 'select @@SERVERNAME'

피오드비시

다음과 같이 입력해야 합니다.

mssql 뒤에 "+pyodbc"가 붙습니다.

사용해 보십시오.

from sqlalchemy import create_engine

engine = create_engine("mssql+pyodbc://user:password@host:port/databasename?driver=ODBC+Driver+17+for+SQL+Server")

cnxn = engine.connect()

저한테는 효과가 있어요.

행운을 빌어요!

연결하려는 경우: 로컬로 호스팅되지 않은 서버에 대한 DNS 없는 Windows 인증확인.ODBC 연결을 사용하지 않습니다.

다음을 시도합니다.

import sqlalchemy

engine = sqlalchemy.create_engine('mssql+pyodbc://' + server + '/' + database + '?trusted_connection=yes&driver=SQL+Server')

이렇게 하면 ODBC 연결을 사용할 수 없으므로 DPAPI2와 DBAPI3 충돌에서 발생하는 pyobdc 인터페이스 오류를 방지할 수 있습니다.

저는 URL을 처음부터 만드는 대신 URL 생성 도구를 사용하는 것을 추천합니다.

connection_url = sqlalchemy.engine.URL.create("mssql+pyodbc",database=databasename, host=servername, query = {'driver':'SQL Server'})

engine = sqlalchemy.create_engine(connection_url)

SQL Server 인증(비도메인, 사용자 이름 및 암호 사용)을 사용하여 연결 문자열을 만들려면 이 링크를 참조하십시오.

언급URL : https://stackoverflow.com/questions/24085352/how-do-i-connect-to-sql-server-via-sqlalchemy-using-windows-authentication

반응형