Jos*_*tel 76 sql-server pyodbc python-3.x pandas
我试图理解当我设置 python 代码在 VM 服务器上运行时开始出现的以下错误,该服务器在我的桌面上安装了 3.9.5 而不是 3.8.5。不确定这是否重要,但这可能是部分原因。
错误
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(
Run Code Online (Sandbox Code Playgroud)
这是一个相当简单的 .py 文件,该文件导入 pyodbc 和 sqlalchemy fwiw。产生警告的 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
Run Code Online (Sandbox Code Playgroud)
我在 python 中看到的使用 pyodbc 的所有示例看起来都非常相似。pyodbc 是否已被弃用?有没有更好的方法可以在没有警告的情况下达到类似的结果?
Gor*_*son 86
\n\npyodbc 是否已被弃用?
\n
不。至少在过去的几年里,pandas 的文档已经明确指出它想要
\nConnectable(即EngineorConnection对象),(转向 SQLAlchemy 几乎是普遍的,但他们继续支持 SQLite 连接以实现向后兼容性。)人们一直在传递其他 DBAPI 连接(如 pyodbcConnection对象)进行读取操作,并且 pandas 没有抱怨 \xe2\x80\xa6到目前为止。
\n\n有没有更好的方法可以在没有警告的情况下达到类似的结果?
\n
是的。您可以使用现有的 ODBC 连接字符串并使用它来创建 SQLAlchemy对象,如SQLAlchemy 1.4 文档Engine中所述:
from sqlalchemy.engine import URL\nconnection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=dagger;DATABASE=test;UID=user;PWD=password"\nconnection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string})\n\nfrom sqlalchemy import create_engine\nengine = create_engine(connection_url)\nRun Code Online (Sandbox Code Playgroud)\n然后使用 SQLAlchemyengine来处理您需要的 pandas 方法。例如,使用 SQLAlchemy 2.0 和 pandas 1.5.3:
import pandas as pd\nimport sqlalchemy as sa\n\n# \xe2\x80\xa6\n\nwith engine.begin() as conn:\n df = pd.read_sql_query(sa.text("SELECT \'thing\' as txt"), conn)\nRun Code Online (Sandbox Code Playgroud)\n
Raf*_*ael 18
这个对我有用。注意,它将忽略所有当前和未来的警告。
import warnings
warnings.filterwarnings('ignore')
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
您可以使用 SQL Server 名称或 IP 地址,但这需要基本的 DNS 列表。不过,大多数企业服务器应该已经有此列表。您可以使用nslookup命令提示符中的命令后跟服务器名称或 IP 地址来检查服务器名称或 IP 地址。
我在 VMWare 上运行的 Ubuntu 服务器上使用 SQL 2017。我在这里连接 IP 地址,作为更广泛的“在 Ubuntu 上运行 MSSQL”项目的一部分。
如果您使用 Windows 凭据进行连接,则可以将 params 替换为 参数trusted_connection。
params = urllib.parse.quote_plus("DRIVER={SQL Server};"
"SERVER="+server+";"
"DATABASE="+database+";"
"trusted_connection=yes")
Run Code Online (Sandbox Code Playgroud)
小智 6
由于它是一个警告,我使用警告 python 库抑制了该消息。希望这可以帮助
import warnings
with warnings.catch_warnings(record=True):
warnings.simplefilter("always")
#your code goes here
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140294 次 |
| 最近记录: |