带有Python的Python异常No描述read_sql

时间:2019-01-29 18:39:50

标签: python sql-server pandas ms-access pyodbc

我正在使用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}")

引发的错误:

  

Message =('HY000',“ [HY000] [Microsoft] [ODBC Microsoft Access驱动程序]   ODBC-连接到“ SQL ServerSERVERNAME的ODBC驱动程序13”失败。   (-2001)(SQLExecDirectW)“)
  来源= 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:

事实证明我的访问权限是32位的。但这仍然不能解释为什么我最初使用32位Python 3.7时无法连接。

谢谢。

1 个答案:

答案 0 :(得分:1)

我能够通过简单的操作使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")