繁体   English   中英

带有Python的Python异常No描述read_sql

[英]Python Exception No Description with Pandas read_sql

我正在尝试使用Python从SQL Server中读取表,然后将数据插入Access中的表中。 我发现做到这一点的最佳方法是使用pandas数据框。 我编写了一个程序,将SQL Server表读入数据帧,如下所示:

dataframe = pandas.read_sql(selectSql, srcConn)

它在约209MB的表上运行良好。 当我在〜1,116MB的表上尝试时,会抛出一个没有描述的异常。 我猜想这与它正在读取的表的大小有关(如果这样的话,那会很好)。 我知道Access只能容纳2GB,但其中还有很多空间,在抛出错误之前,它甚至没有到达写入Access的部分。

有什么办法可以解决较大的表吗? 是否有更好的方法使用Python将表从SQL Server 2008 R2复制到Access 2016? 我在Win10 64位上有16GB的RAM,所以这应该不是问题。 我尝试了32位Python 3.7和64位Python 3.6都没有用。 我先尝试了SSIS,但是每当尝试打开与Access的连接的程序包时,它都会崩溃整个Visual Studio。

更新:

我遵循以下Gord的建议,现在我的代码如下所示:

access_cnxn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=' + access_db + ';'
)
sqls_cnxn_str = (
    r'DRIVER=ODBC Driver 13 for SQL Server;'
    r'SERVER=' + sqls_server + ';'
    r'DATABASE=' + sqls_db + ';'
    r'UID=' + sqls_username + ';'
    r'PWD=' + sqls_password + ';'
)

此连接本身起作用:

sqls_cnxn = pyodbc.connect(sqls_cnxn_str)

这种连接本身是有效的:

pyodbc.pooling = False
access_cnxn = pyodbc.connect(access_cnxn_str, autocommit = True)

但这会引发错误:

access_cnxn.execute(f"SELECT * INTO {access_table} FROM [ODBC;{sqls_cnxn_str}].{sqls_table}")

引发的错误:

消息=(“ HY000”,“ [HY000] [Microsoft] [ODBC Microsoft Access驱动程序] ODBC--连接到“用于SQL ServerSERVERNAME的ODBC驱动程序13”失败(-2001)(SQLExecDirectW)”)
源= C:\\用户\\ bruescm \\源\\回购\\ DB_Test \\ DB_Test \\ SyncAllTests.py
StackTrace:文件“ C:\\ Users \\ bruescm \\ source \\ repos \\ DB_Test \\ DB_Test \\ SyncAllTests.py”,第57行,位于sync_table dest_cnxn.execute(f“ SELECT * INTO {access_table} FROM [ODBC; {sqls_cnxn_str}]]中。 {sqls_table}“)文件“ C:\\ Users \\ bruescm \\ source \\ repos \\ DB_Test \\ DB_Test \\ SyncAllTests.py”,第121行,位于主sync_table('',sqls_table,get_access_cnxn(),access_table)文件“ C:\\ Users \\ bruescm \\ source \\ repos \\ DB_Test \\ DB_Test \\ SyncAllTests.py“,第124行,位于main()中

错误中的SERVERNAME是SQL Server所在的服务器的名称。 不知道为什么将其与错误中的驱动程序名称相对应。

有任何想法吗?

更新2:

原来我的访问权限是32位的。 这仍然不能解释为什么它无法连接,因为我最初使用的是Python 3.7 32位。

谢谢。

我能够通过简单的操作使Access数据库引擎从SQL Server中提取表并在Access数据库中创建一个副本

pyodbc.pooling = False  # required
cnxn = pyodbc.connect("DSN=myAccessDb", autocommit=True)
cnxn.execute("SELECT * INTO access_tbl FROM [ODBC;DSN=SQLmyDb].sql_server_tbl")

其中, SQLmyDb是我的SQL Server实例的ODBC DSN。

更新

刚刚进行测试以确认无DSN的连接字符串也可以正常工作:

pyodbc.pooling = False  # required
access_cnxn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\__tmp\test.accdb;'
)
cnxn = pyodbc.connect(access_cnxn_str, autocommit=True)
sql_cnxn_str = (
    r'DRIVER=ODBC Driver 17 for SQL Server;'
    r'SERVER=(local)\SQLEXPRESS;'
    r'DATABASE=myDb;'
    r'Trusted_Connection=Yes;'
)
cnxn.execute(f"SELECT * INTO access_tbl FROM [ODBC;{sql_cnxn_str}].sql_server_tbl")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM