为什么 to_sql 在 pandas 中不能使用 pyodbc?
Why to_sql is not working with pyodbc in pandas?
我有一个 excel 文件。我正在将其导入数据框并尝试使用数据更新数据库 table。
import pyodbc
def get_sale_file():
try:
cnxn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server;'
'SERVER=' + server + ';DATABASE=' + database + ';UID=' + uname + ';PWD=' + pword,
autocommit=False)
files = os.listdir(ile_path)
df = pd.DataFrame()
for f in files:
if (f.endswith('.xlsx') or f.endswith('.xls')):
df = pd.read_excel(os.path.join(sap_file_path, f))
df.to_sql('temptable', cnxn, if_exists='replace')
query = "UPDATE MList AS mas" + \
" SET TTY = temp.[Territory Code] ," + \
" Freq =temp.[Frequency Code]," + \
" FROM temptable AS temp" + \
" WHERE mas.SiteCode = temp.[ri a]"
当我执行上面的代码块时;我得到
1/12/2019 10:19:45 AM ERROR: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW)")
我尝试的方式正确吗?除了 to_sql?
之外,panads 是否有任何其他功能来更新 mssql table
我该如何克服上述错误?
编辑
我是否必须事先创建 temptable 才能加载 datafarme?如果是这样,我的文件包含 100 列,它可能会有所不同..(除了几列)我怎么能确保 pandas 只加载几列到 temptable?
您也可以尝试使用其他软件包来代替 pyodbc,例如pytds 或 adodbapi。
第一个非常简单,使用 adodbapi 连接配置看起来像
from adodbapi import adodbapi as adba
raw_config_adodbapi = f"PROVIDER=SQLOLEDB.1;Data Source={server};Initial Catalog={database};trusted_connection=no;User ID={user};Password={password};"
conn = adba.connect(raw_config_adodbapi, timeout=120, autocommit=True)
此外,pyodbc 的连接字符串中的参数似乎应该包含在{} 中,但也许这不是强制性的。
根据 pandas.DataFrame.to_sql (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html) 的指南,连接需要连接类型 sqlalchemy.engine.Engine 或 sqlite3.Connection ,然后需要使用类似的连接更改您的代码这 :
import sqlalchemy
import pyodbc
cnxn = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@<dsnname>")
df.to_sql("table_name", cnxn,if_exists='replace')
更新:使用 urllib
import urllib
import pyodbc
params = urllib.quote_plus("DRIVER={ODBC Driver 17 for SQL Server};SERVER=yourserver;DATABASE=yourdatabase ;UID=user;PWD=password")
cnxn = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
df.to_sql("table_name", cnxn,if_exists='replace')
我有一个 excel 文件。我正在将其导入数据框并尝试使用数据更新数据库 table。
import pyodbc
def get_sale_file():
try:
cnxn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server;'
'SERVER=' + server + ';DATABASE=' + database + ';UID=' + uname + ';PWD=' + pword,
autocommit=False)
files = os.listdir(ile_path)
df = pd.DataFrame()
for f in files:
if (f.endswith('.xlsx') or f.endswith('.xls')):
df = pd.read_excel(os.path.join(sap_file_path, f))
df.to_sql('temptable', cnxn, if_exists='replace')
query = "UPDATE MList AS mas" + \
" SET TTY = temp.[Territory Code] ," + \
" Freq =temp.[Frequency Code]," + \
" FROM temptable AS temp" + \
" WHERE mas.SiteCode = temp.[ri a]"
当我执行上面的代码块时;我得到
1/12/2019 10:19:45 AM ERROR: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW)")
我尝试的方式正确吗?除了 to_sql?
之外,panads 是否有任何其他功能来更新 mssql table
我该如何克服上述错误?
编辑 我是否必须事先创建 temptable 才能加载 datafarme?如果是这样,我的文件包含 100 列,它可能会有所不同..(除了几列)我怎么能确保 pandas 只加载几列到 temptable?
您也可以尝试使用其他软件包来代替 pyodbc,例如pytds 或 adodbapi。 第一个非常简单,使用 adodbapi 连接配置看起来像
from adodbapi import adodbapi as adba
raw_config_adodbapi = f"PROVIDER=SQLOLEDB.1;Data Source={server};Initial Catalog={database};trusted_connection=no;User ID={user};Password={password};"
conn = adba.connect(raw_config_adodbapi, timeout=120, autocommit=True)
此外,pyodbc 的连接字符串中的参数似乎应该包含在{} 中,但也许这不是强制性的。
根据 pandas.DataFrame.to_sql (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html) 的指南,连接需要连接类型 sqlalchemy.engine.Engine 或 sqlite3.Connection ,然后需要使用类似的连接更改您的代码这 :
import sqlalchemy
import pyodbc
cnxn = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@<dsnname>")
df.to_sql("table_name", cnxn,if_exists='replace')
更新:使用 urllib
import urllib
import pyodbc
params = urllib.quote_plus("DRIVER={ODBC Driver 17 for SQL Server};SERVER=yourserver;DATABASE=yourdatabase ;UID=user;PWD=password")
cnxn = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
df.to_sql("table_name", cnxn,if_exists='replace')