Nano Hash - криптовалюты, майнинг, программирование

Как использовать pyodbc для переноса таблиц из MS Access в Postgres?

Мне нужно перенести таблицы из MS Access в Postgres. Я хотел бы использовать pyodbc для этого, поскольку он позволяет мне подключаться к базе данных Access с помощью python и запрашивать данные.

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

import pyodbc

access_conn_str = (r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; 'r'DBQ=C:\Users\bob\access_database.accdb;')
access_conn = pyodbc.connect(access_conn_str)
access_cursor = access_conn.cursor()

postgres_conn_str = ("DRIVER={PostgreSQL Unicode};""DATABASE=access_database;""UID=user;""PWD=password;""SERVER=localhost;""PORT=5433;")
postgres_conn = pyodbc.connect(postgres_conn_str)
postgres_cursor = postgres_conn.cursor()

table_ditc = {}
row_dict = {}

for row in access_cursor.columns(table='table1'):
    row_dict[row.column_name] = [row.type_name, row.column_size]

table_ditc['table1'] = row_dict

for table, values in table_ditc.items():
    print(f"Creating table for {table}")

    access_cursor.execute(f'SELECT * FROM {table}')
    result = access_cursor.fetchall()

    postgres_cursor.execute(f'''CREATE TABLE {table} (Do I just put a bunch of string formatting in here?);''')
    postgres_cursor.executemany(f'INSERT INTO {table} (Do I just put a bunch of string formatting) VALUES (string formatting?)', result)

postgres_conn.commit()

Как видите, с помощью pyodbc я не совсем уверен, как создавать операторы SQL. Я знаю, что могу построить длинную строку вручную, но если бы я делал кучу разных таблиц с разными полями и т. д., это было бы нереалистично. Есть ли лучший и простой способ создать таблицу и вставить строки на основе схемы базы данных Access?


  • Вы искали существующие инструменты, которые могли бы позаботиться о черновой работе за вас? Возможно, что-то вроде этого? 13.03.2021
  • @GordThompson Нет, я не изучал другие инструменты. То, что вы предложили, выглядит довольно красиво, я проверю это. 13.03.2021
  • инструменты MDB. Пример: mdb-schema -T some_table some_db.mdb postgres 13.03.2021
  • @AdrianKlaver Я попробовал инструменты MDB. Когда я экспортирую таблицы с помощью этой команды mdb-schema access_database.accdb postgres | tr 'A-Z' 'a-z' | psql -d postgres_database -U postgres -W -h 192.168.0.242 -p 5433, она создает все таблицы, но в конце я получаю две ошибки: ОШИБКА: отношение msysnavpanegroups не существует. ОШИБКА: отношение msysnavpanegrouptoobjects не существует. Я также получаю ошибки при попытке загрузить данные ( его циклический и говорящий столбец не существует). У вас есть идеи, почему это может быть? 13.03.2021
  • Ну, во-первых, я бы сначала направил вывод mdb-schema в файл, чтобы проверить вывод. При каждом переходе с одной системы на другую будут возникать несоответствия. Есть ли таблица msysnavpanegroups в базе данных Access? Это в выводе, произведенном mdb-schema? Какой столбец не существует и какова точная ошибка? Добавьте к своему вопросу ответы выше. 13.03.2021
  • @AdrianKlaver Я запустил mdb-schema access_database.accdb > schema.txt и НЕ увидел эти две таблицы. Я также не вижу их, когда просматриваю базу данных в Access. Это скрытые столы или что-то в этом роде? Когда я пытаюсь загрузить данные, возникает ошибка ERROR: column "21" does not exist, но она повторяется для каждой записи в таблице. но имя столбца меняется, например. 198, 589, 325 и т. д. Похоже, что эти числа являются записями в определенном столбце, а не в столбцах, поэтому я не уверен, почему для каждой записи говорится, что столбец не существует. 14.03.2021
  • Решил проблему со вставкой. Мне пришлось добавить флаг -q вот так mdb-export -I postgres -q "'" access_database.accdb table1 | tr 'A-Z' 'a-z' | psql -d postgres_database -U postgres -W -h 192.168.0.242 -p 5433 14.03.2021
  • @ fpolig01 - Если вы нашли решение, рассмотрите возможность публикации ответа, в котором кратко объясняется, что вы сделали. Это облегчит поиск следующего человека. 14.03.2021

Ответы:


1

В конечном итоге я использовал комбинацию pyodbc и pywin32. pywin32 — это, по сути, очень тонкая оболочка Python, которая позволяет нам взаимодействовать с COM-объектами и автоматизировать приложения Windows с помощью Python (цитируется по второй ссылке ниже).

Я смог программно взаимодействовать с Access и экспортировать таблицы напрямую в Postgres с помощью DoCmd.TransferDatabase

https://docs.microsoft.com/en-us/office/vba/api/access.docmd.transferdatabase https://pbpython.com/windows-com.html

import win32com.client
import pyodbc
import logging
from pathlib import Path

conn_str = (r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; 'rf'DBQ={access_database_location};')
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

a = win32com.client.Dispatch("Access.Application")
a.OpenCurrentDatabase(access_database_location)

table_list = []

for table_info in cursor.tables(tableType='TABLE'):
    table_list.append(table_info.table_name)

for table in table_list:
    logging.info(f"Exporting: {table}")

    acExport = 1
    acTable = 0
    db_name = Path(access_database_location).stem.lower()

    a.DoCmd.TransferDatabase(acExport, "ODBC Database", "ODBC;DRIVER={PostgreSQL Unicode};"f"DATABASE={db_name};"f"UID={pg_user};"f"PWD={pg_pwd};""SERVER=localhost;"f"PORT={pg_port};", acTable, f"{table}", f"{table.lower()}_export_from_access")

    logging.info(f"Finished Export of Table: {table}")
    logging.info("Creating empty table in EGDB based off of this")

Этот подход, кажется, работает для меня. Мне нравится, как создание таблицы/полей, а также вставка данных обрабатываются автоматически (это была первоначальная проблема, с которой я столкнулся с pyodbc).

Если у кого-то есть лучшие подходы, я открыт для предложений.

14.03.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..