Исключение Python без описания с Pandas read_sql - PullRequest
0 голосов
/ 29 января 2019

Используя Python, я пытаюсь прочитать таблицу из SQL Server, а затем вставить данные в таблицу в Access.Лучший способ, который я нашел для этого, - использование фрейма данных pandas.Я написал программу, которая читает таблицу SQL Server в фрейм данных примерно так:

dataframe = pandas.read_sql(selectSql, srcConn)

И она прекрасно работает на столе размером ~ 209 МБ.Когда я пытаюсь сделать это на столе размером ~ 1116 МБ, возникает исключение без описания.Я предполагаю, что это связано с размером таблицы, в которой он читается (было бы хорошо, если бы он сказал это).Я знаю, что Access может вместить только 2 ГБ, но в нем достаточно места, и он даже не доходит до той части, где пишет в Access, до выдачи ошибки.

Есть ли способ исправить это длябольшие столы?Есть ли лучший способ, которым я должен копировать таблицы из SQL Server 2008 R2 в Access 2016 с помощью Python?У меня 16 ГБ ОЗУ на Win10 64-bit, так что проблем не должно быть.Я пробовал 32-битный Python 3.7 и 64-битный Python 3.6 безрезультатно.Сначала я попробовал SSIS, но он вылетал из моей всей Visual Studio всякий раз, когда я пытался открыть пакет с подключением к Access.

ОБНОВЛЕНИЕ:

Я следовал совету Горда ниже итеперь мой код выглядит так:

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 - соединение«ODBC-драйвер 13 для SQL ServerSERVERNAME» не удалось. (-2001) (SQLExecDirectW) ")
Source = C: \ Users \ bruescm \ source \ repos \ DB_Test \ DB_Test \ SyncAllTests.py
StackTrace: File"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 голосов
/ 29 января 2019

Мне удалось заставить Access Database Engine извлечь таблицу из 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 - ODBC DSN для моего SQLЭкземпляр сервера.

Обновление

Только что протестировано, чтобы убедиться, что строки подключения без 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...