Используйте Python для вставки данных в базу данных MS Access. - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь вставить значения в базу данных Microsoft Access, используя Python.

Я могу вставить значения следующим образом:

df = pd.read_excel(xlsx, sheets[0])

for i in range(1, len(sheets)):
    data = []
    data = pd.read_excel(xlsx, sheets[i])
    df = df.append(data)

k = (df.iat[3,0])
conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ= \\.....\Stat_tracker.accdb;')
cursor = conn.cursor()
cursor.execute("INSERT INTO ABCD (Serial) VALUES ('xxxx')")

cursor.execute('select * from ABCD')
for row in cursor.fetchall():
    print(row)

Я хочу использовать все oop для перебора нескольких записей. Есть ли лучший способ?

Когда я заменяю код cursor.execute на

cursor.execute("INSERT INTO ABCD (Serial) VALUES (%s)",(k,))

Он возвращает следующую ошибку:

pyodb c .ProgrammingError: ('42000', "[42000] [Microsoft] [ODB C Драйвер Microsoft Access] Синтаксическая ошибка в выражении запроса "% s". (-3100) (SQLPrepare) ")

Очевидно, я что-то упускаю при использовании %s. Возможно, есть другой заполнитель?

Это должно быть простое исправление Я просто слишком незнаком с синтаксисом.

Помогите новичку ie out?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Python s Спецификация API базы данных списки несколько способов параметризации :

  • qmark: стиль вопросительного знака, например, ...WHERE name=?
  • numeric: Нумерация c, позиционный стиль, например, ...WHERE name=:1
  • named: Именованный стиль, например, ...WHERE name=:name
  • format: Коды формата ANSI C printf, например, ...WHERE name=%s
  • pyformat: Python расширенные коды формата, например, ...WHERE name=%(name)s

Большинство реализаций поддерживают только один или, возможно, два , Он выглядит так: pyodbc использует параметры стиля qmark, а не стиль format.

Попробуйте вместо этого:

cursor.execute("INSERT INTO ABCD (Serial) VALUES (?)", (k,))
0 голосов
/ 26 января 2020

Рассмотрим чистый запрос SQL, поскольку движок MS Access Jet / ACE может напрямую запрашивать книги Excel. В частности, выполните запрос insert-select UNION, избегая использования pandas, зацикливания или параметров.

Ниже предполагается, что заголовок столбца Serial существует на каждом листе Excel и является столбцом, для которого вы хотите l oop. Отрегулируйте соответственно.

sql = """INSERT INTO ABCD (Serial)
         SELECT t1.Serial 
         FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet1$] t1

         UNION ALL

         SELECT t2.Serial 
         FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet2$] t2

         UNION ALL

         SELECT t3.Serial 
         FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet3$] t3

         ...
      """

cur.execute(sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...