微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlalchemy MSSQL + pyodbc模式无

如何解决sqlalchemy MSSQL + pyodbc模式无

我正在尝试通过sqlalchemy连接到sql Server 2019。我同时使用mssql + pyodbc和msql + pyodbc_mssql,但是在两种情况下都无法连接,总是返回未定义的default_schema_name。 已经检查数据库,定义的用户架构以及所有内容

示例:

from sqlalchemy import create_engine
import urllib 
from sqlalchemy import create_engine
server = 'server' 
database = 'db' 
username = 'user' 
password = 'pass' 
#cnxn = 'DRIVER={ODBC Driver 17 for sql Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password+';Trusted_Connection=yes'
cnxn = 'DSN=sql Server;SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password+';Trusted_Connection=yes'
params = urllib.parse.quote_plus(cnxn)

engine = create_engine('mssql+pyodbc:///?odbc_connect=%s' % params)
cnxn = engine.connect()

返回None,方言.default_schema_name
AttributeError:“ MSDialect_pyodbc”对象没有属性“ default_schema_name”

TIA .....

解决方法

希望以下内容足以提供最小可行样本。我在一个更大的脚本中使用它来每天移动 1200 万行 3 次,因此我包含了一个我从别处捏来的分块示例。

#Set up enterprise DB connection
# Enterprise DB to be used
DRIVER = "ODBC Driver 17 for SQL Server"
USERNAME = "SQLUsername"
PSSWD = "SQLPassword"
SERVERNAME = "SERVERNAME01"
INSTANCENAME = "\SQL_01"
DB = "DATABASE_Name"
TABLE = "Table_Name"

#Set up SQL database connection variable / path
#I have included this as an example that can be used to chunk data up
conn_executemany = sql.create_engine(
    f"mssql+pyodbc://{USERNAME}:{PSSWD}@{SERVERNAME}{INSTANCENAME}/{DB}?driver={DRIVER}",fast_executemany=True
)




#Used for SQL Loading from Pandas DF
def chunker(seq,size):
    return (seq[pos : pos + size] for pos in range(0,len(seq),size))

#Used for SQL Loading from Pandas DF
def insert_with_progress(df,engine,table="",schema="dbo"):
    con = engine.connect()

    # Replace table
    #engine.execute(f"DROP TABLE IF EXISTS {schema}.{table};") #This only works for SQL Server 2016 or greater
    try:
      engine.execute(f"DROP TABLE Temp_WeatherGrids;")
    except:
      print("Unable to drop temp table")
    
    try:
      engine.execute(f"CREATE TABLE [dbo].[Temp_WeatherGrids]([col_01] [int] NULL,[Location] [int] NULL,[DateTime] [datetime] NULL,[Counts] [real] NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];")
    except:
      print("Unable to create temp table")
    

    # Insert with progress
    SQL_SERVER_CHUNK_LIMIT = 250000
    chunksize = math.floor(SQL_SERVER_CHUNK_LIMIT / len(df.columns))

    for chunk in chunker(df,chunksize):
        chunk.to_sql(
            name=table,con=con,if_exists="append",index=False
        )


if __name__ == '__main__':

    # intialise data. Example -  make your own dataframe. DateTime should be pandas datetime objects. 
    data = {'Col_01':[0,1,2,3],'Location':['Bar','Pub','Brewery','Bottleshop'],'DateTime':["1/1/2018","1/1/2019","1/1/2020","1/1/2021"],'Counts':[1,3,4} 
  
    # Create DataFrame 
    df = pd.DataFrame(data) 

    insert_with_progress(df,conn_executemany,table=TABLE)
    del [df]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。