Pandas read_sql的Python异常无描述



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

dataframe = pandas.read_sql(selectSql, srcConn)

它在约209MB的表上运行良好。当我在~1116MB的表上尝试它时,它会抛出一个没有描述的异常。我猜这与它正在阅读的桌子的大小有关(如果它这么说就好了)。我知道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崩溃。

更新:

我遵循了戈尔德下面的建议,现在我的代码看起来是这样的:

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}")

抛出的错误:

Message=('HY000',"[HY000][Microsoft][ODBC Microsoft Access Driver]ODBC--连接到"SQL ServerSERVERNAME的ODBC驱动程序13"失败。(-2001)(SQLExecDirectW)")
Source=C:\Users\bruescm\Source\repos\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:

原来我的Access是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:__tmptest.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")

相关内容

  • 没有找到相关文章

最新更新