programing

Pyodbc Connection 개체를 팬더와 함께 사용할 때 경고 표시

yellowcard 2023. 7. 4. 21:50
반응형

Pyodbc Connection 개체를 팬더와 함께 사용할 때 경고 표시

데스크톱에 3.8.5 대신 3.9.5가 설치된 VM 서버에서 실행되도록 파이썬 코드를 설정했을 때 발생한 다음 오류를 이해하려고 합니다.그게 중요한지는 모르겠지만, 이유의 일부일 수도 있습니다.

오류

C:\ProgramData\Miniconda3\lib\site-packages\pandas\io\sql.py:758: UserWarning: pandas only support SQLAlchemy connectable(engine/connection) or
database string URI or sqlite3 DBAPI2 connection
other DBAPI2 objects are not tested, please consider using SQLAlchemy
  warnings.warn(

이 파일은 pyodbc 및 sqlalchemy fwiw를 가져오는 매우 간단한 .py 파일 내에 있습니다.경고를 생성하는 SQL 호출의 상당히 일반적이고 단순한 버전은 다음과 같습니다.

myserver_string = "xxxxxxxxx,nnnn"
db_string = "xxxxxx"

cnxn = "Driver={ODBC Driver 17 for SQL Server};Server=tcp:"+myserver_string+";Database="+db_string +";TrustServerCertificate=no;Connection Timeout=600;Authentication=ActiveDirectoryIntegrated;"

def readAnyTable(tablename, date):
    conn = pyodbc.connect(cnxn)
    
    query_result = pd.read_sql_query(
            ''' 
                 SELECT *
                 FROM [{0}].[dbo].[{1}]
                where Asof >= '{2}'
            '''.format(db_string,tablename,date,), conn)
            
    conn.close()
    
    return query_result

파이썬에서 pyodbc를 사용하여 본 모든 예는 상당히 유사합니다.pyodbc가 더 이상 사용되지 않게 되었습니까?경고 없이 유사한 결과를 얻을 수 있는 더 좋은 방법이 있습니까?

pyodbc가 더 이상 사용되지 않게 되었습니까?

아니요. 적어도 지난 몇 년 동안 판다의 문서는 분명히 다음 중 하나를 원한다고 명시했습니다.

  1. 완전한 계획Connectable(즉, anEngine또는Connection객체),
  2. SQL 화학 연결 URL을 포함하는 문자열, 또는
  3. SQLite DBAPI 연결입니다.

(SQL 화학으로의 전환은 거의 보편적이었지만 이전 버전과의 호환성을 위해 SQLite 연결을 계속 지원했습니다.)사람들이 다른 DBAPI 연결(예: pyodbc)을 전달하고 있습니다.Connection읽기 작업을 위한 목적으로, 팬더는 지금까지 불평하지 않았습니다.

경고 없이 유사한 결과를 얻을 수 있는 더 좋은 방법이 있습니까?

예. 기존 ODBC 연결 문자열을 사용하여 SQL 화학을 생성할 수 있습니다.EngineSQLAlchemy 1.4 설명서에 설명된 개체:

from sqlalchemy.engine import URL
connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=dagger;DATABASE=test;UID=user;PWD=password"
connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string})

from sqlalchemy import create_engine
engine = create_engine(connection_url)

그런 다음 SQL 화학을 사용합니다.engine당신이 필요로 하는 판다 방법을 연구하는 것.예를 들어 SQLAlchemy 2.0 및 Panda 1.5.3의 경우:

import pandas as pd
import sqlalchemy as sa

# …

with engine.begin() as conn:
    df = pd.read_sql_query(sa.text("SELECT 'thing' as txt"), conn)

저한테는 효과가 있어요.

import warnings

warnings.filterwarnings('ignore')
    import pandas as pd
    import pyodbc
    import sqlalchemy as sa
    import urllib
    from sqlalchemy import create_engine, event
    from sqlalchemy.engine.url import URL
    
    server = 'IP ADDRESS or Server Name' 
    database = 'AdventureWorks2014' 
    username = 'xxx' 
    password = 'xxx' 
    
    params = urllib.parse.quote_plus("DRIVER={SQL Server};"
                                     "SERVER="+server+";"
                                     "DATABASE="+database+";"
                                     "UID="+username+";"
                                     "PWD="+password+";")
    
    engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))
    
    qry = "SELECT t.[group] as [Region],t.name as [Territory],C.[AccountNumber]"
    qry = qry + "FROM [Sales].[Customer] C INNER JOIN [Sales].SalesTerritory t on t.TerritoryID = c.TerritoryID "
    qry = qry + "where StoreID is not null and PersonID is not null"

with engine.connect() as con:
    rs = con.execute(qry)

    for row in rs:
        print (row)

SQL 서버 이름 또는 IP 주소를 사용할 수 있지만 기본 DNS 목록이 필요합니다.그러나 대부분의 회사 서버에는 이미 이 목록이 있어야 합니다.다음을 사용하여 서버 이름 또는 IP 주소를 확인할 수 있습니다.nslookup명령 프롬프트 뒤에 서버 이름 또는 IP 주소가 표시됩니다.

VMware에서 실행되는 Ubuntu 서버에서 SQL 2017을 사용하고 있습니다.저는 더 넓은 "Ubuntu에서 MSSQL 실행" 프로젝트의 일환으로 여기 IP 주소로 연결합니다.

윈도우즈 인증 정보로 연결하는 경우 매개 변수를trusted_connection매개 변수

params = urllib.parse.quote_plus("DRIVER={SQL Server};"
                                 "SERVER="+server+";"
                                 "DATABASE="+database+";"
                                 "trusted_connection=yes")

경고이므로 경고 파이썬 라이브러리를 사용하여 메시지를 억제했습니다.이것이 도움이 되길 바랍니다.

import warnings
with warnings.catch_warnings(record=True):
    warnings.simplefilter("always")
    #your code goes here

우리 회사는 SQL 화학을 사용하지 않습니다. pscycopg2 기반의 포스트그레스 연결을 선호하고 다른 기능을 통합합니다.할 수 됩니다. 과 같이 시작합니다. 다음과 같이 시작합니다.python3 -W ignore

SQL에 대한 은 다음과 .1.4.36사용 중:

import pandas as pd
from sqlalchemy import create_engine, event
from sqlalchemy.engine.url import URL
#...

conn_str = set_db_info()    # see above
conn_url = URL.create("mssql+pyodbc", query={"odbc_connect": conn_str})
engine = create_engine(conn_url)

df = pd.read_sql(SQL, engine)
df.head()

언급URL : https://stackoverflow.com/questions/71082494/getting-a-warning-when-using-a-pyodbc-connection-object-with-pandas

반응형