Я пытаюсь автоматизировать процесс на работе, чтобы пользователь мог просто запустить скрипт Python вместо того, чтобы войти в ms access для выполнения каждого запроса и экспорта таблиц индивидуально.
Запрос является сохраненным запросом обновления и должен быть запущен до экспорта любых таблиц.
У меня экспорт работает нормально, но я не могу понять, как заставить запрос работать правильно.
Я нашел ответ, который сказал:
Если запрос относится к другому типу запроса (например, SELECT
с параметрами, INSERT
, UPDATE
, ...) затем драйвер Access ODBC
представляет их как хранимые процедуры, поэтому вам нужно использовать синтаксис ODBC {CALL...}
, как в
import pyodbc
connStr = (
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
r"DBQ=C:\Users\Public\Database1.accdb;"
)
cnxn = pyodbc.connect(connStr)
sql = """\
{CALL mySavedUpdateQueryInAccess}
"""
crsr = cnxn.execute(sql)
cnxn.commit()
crsr.close()
cnxn.close()
, но я получаю сообщение об ошибке:
Traceback (последний вызов был последним): файл "C: \ Users \ servi \ OneDrive \ Documents \ Haley \ Licence_Management_Test \ Mercator_Licence_Management.py", строка 23, в qry = con.execute (SQL_qry) pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft] [ODBC Microsoft Access Driver] Синтаксическая ошибка в выражении UPDATE. (-3503) (SQLExecDirectW)')
import csv
import pyodbc
# constants
MDB = ("Z:\\pathway;")
DRV='{Microsoft Access Driver (*.mdb, *.accdb)};'
PWD="password"
# connect to db
con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD))
cur = con.cursor()
filepath = ("C:\\pathway")
#run query
SQL_qry = "UPDATE * CALL qry_Master_Licence_List;"
qry = con.execute(SQL_qry) # executes command
print ("Querying results")
#get table info
SQL_tbl = 'SELECT * FROM tbl_Master_Licence_List;'
rows = cur.execute(SQL_tbl).fetchall()
cur.close()
con.close()
#export table as .csv
with open(filepath + 'Master_Licence_List.csv', 'w', newline='') as
fou:
csv_writer = csv.writer(fou)