Должен ли я использовать pyodb c или win32com для заполнения уже существующих форм в базе данных Microsoft Access (.accdb), используя python? - PullRequest
1 голос
/ 15 апреля 2020

Я написал python скрипт, который извлекает строки из текстовых документов. Цель состоит в том, чтобы затем вставить эти строки в уже существующую форму в базе данных Access, сохранить ее, создать дубликат формы, вставить различные строки из следующего документа Word, сохранить, повторить. Форма уже содержит все необходимые мне поля, а также кнопки «сохранить» и «создать дубликат».

У меня проблемы с поиском способа вставки строк в форму доступа.

До сих пор я узнал, что есть по крайней мере два способа сделать это, используя pyodb c или win32com.

Я использовал код по следующим ссылкам:

pyodb c - https://datatofish.com/how-to-connect-python-to-ms-access-database-using-pyodbc/

win32com - Запись в таблицу MS Access , python win32com

Я решил проблему подключения 64-битного python к 32-битному доступу и смог подключиться к моему файлу accdb с помощью win32com и pyodb c, но это насколько я понял.

pyodb c:

import pyodbc

conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\path\folder\my_database_file.accdb;')
cursor = conn.cursor()

win32com:

import win32com.client

# ADODB constants
adVarWChar = 202
adInteger = 3
adParamInput = 1

connection = win32com.client.Dispatch(r'ADODB.Connection')

DSN = (
    r'PROVIDER=Microsoft.ACE.OLEDB.12.0;'
    r'DATA SOURCE=C:\path\folder\my_database_file.accdb;'
    )

connection.Open(DSN)

cmd = win32com.client.Dispatch(r'ADODB.Command')
cmd.ActiveConnection = connection

С каким подходом лучше / легче работать, pyodb c или win32com?

Кроме того, как только я выберу подход, как мне продолжить? У меня проблемы с поиском документации о том, как заполнять формы в Access с помощью этих методов. Большинство из того, что я нашел, было о том, как заполнять таблицы в Access, и я не уверен, как транскрибировать этот код для работы с формами вместо этого, или откуда этот код появился.

I не включал код, который извлекает строки из текстовых документов, эта часть работает нормально, и на самом деле это не часть вопроса, а просто справочная информация.

Буду очень признателен за любые советы или указатели в правильном направлении.

1 Ответ

2 голосов
/ 15 апреля 2020

Прежде всего, формы и отчеты MS Access не хранят никаких данных, но применяют визуальную интерактивность с данными таблицы или запроса во время выполнения.

Во-вторых, ваш вопрос показывает, как работает MS Access многогранная вещь , которая одновременно является GUI приложением и базой данных. Из-за этого ваши два подхода (win32com и pyodbc) несколько отчетливо отличаются и частично перекрываются. Как правило, есть два способа взаимодействия с этим программным обеспечением:

Front-End

  1. Просто используйте установленное программное обеспечение Microsoft Office, MSAccess.exe со всеми включенными функциями пользовательского интерфейса для проектирования и использования его объектов: таблиц, запросов, форм, отчетов, макросов и модулей.

  2. Через программный код, интерфейс к Microsoft Получите доступ к библиотеке объектов через внешний клиент, такой как Excel VBA, Python или любой другой язык или API, подключенный к COM.

    В Python использование win32com позволяет получить доступ к GUI объектам MS Access, который включает формы и отчеты, а также любым другим методам Access, таким как DoCmd.TransferSpreadsheet или Application.ImportXML. Для выполнения запросов вам необходим доступ к базовой базе данных объекта приложения Access. В целом, для этого подхода требуется полнофункциональное приложение Office MSAccess.exe, установленное на клиентских компьютерах.

Back-End

  • Подключитесь к базовой базе данных файла .accdb (или .mdb), например ODB C или OLEDB, используя практически любой современный язык общего назначения, например Python, с соответствующими библиотеками.

    В Python использование pyodbc (или adodbapi) позволяет только взаимодействовать с базой данных Jet / ACE (файлы Windows .dll). Вы не можете взаимодействовать с любыми GUI объектами, включая формы и отчеты, но только с таблицами и хранимыми запросами и только с использованием SQL, называемым прикладным уровнем здесь Python. В целом, для этого подхода НЕ требуется полнофункциональное приложение Office MSAccess.exe, установленное на клиентских компьютерах.


С учетом сказанного, для ваших конкретных потребностей c, вам может не потребоваться более длинный и расширенный интерфейс win32com, так как формы доступа предназначены для ввода / обновления / удаления данных в базовых таблицах. Другими словами, они являются удобными средствами обработки данных. Поэтому просто обведите необходимость пользовательского интерфейса и напрямую импортируйте извлеченные данные Word в таблицу базы данных за формой с помощью pyodbc, гораздо более простого внутреннего метода.

В частности, чтобы ответить на ваши вопросы:

Я написал Python скрипт, который извлекает строки из документов Word. Цель состоит в том, чтобы затем вставить эти строки в уже существующую форму в базе данных Access, сохранить ее, создать дубликат формы, вставить различные строки из следующего документа Word, сохранить, повторить.

Во-первых, никто не должен дублировать реальный объект формы, кроме данных. Вместо этого вставьте данные в источник данных за формой, используя объект cursor и параметризацию:

# APPEND QUERY WITH PARAMETERS
sql = """INSERT INTO myTableBehindmyForm (Field1, Field2, Field3, ...)
         VALUES (?, ?, ?, ...)
      """

# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))

Форма уже содержит все необходимые мне поля, и она имеет кнопки «сохранить» и «создать дубликат». У меня проблемы с выяснением того, как вставить строки в форму доступа.

Чтобы сохранить, просто передайте вышеуказанный запрос и повторите его, повторите вызов cursor.execute:

# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
conn.commit()


# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
conn.commit()

Большинство из того, что я нашел, было о том, как заполнять таблицы в Access, и я не уверен, как транскрибировать этот код для работы с формами или откуда этот код берется вообще.

Опять же, не нужно работать с формами (без данных GUI объекты), а просто с таблицами за формами. Поэтому go с pyodbc или любым совместимым MS Access и Python DB-API для обработки ваших потребностей в данных.

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