Форум программистов, компьютерный форум, киберфорум
Python: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41

Отправить данные из PostgreSQL в Oracle

21.12.2022, 19:43. Показов 2198. Ответов 31

Доброго времени суток! Пытаюсь с помощью python из базы postgresql из материальной вьюхи отправить данные данные в двх(оракл).
В базе zabbix postgresql есть материальная вьюха. Обычно в ней примерно 3500 тысячи строк и 11 столбцов. Каждый день данные обновляются и их нужно доставить в оракловую базу, без каких-либо фильтров и манипуляций над данными. То есть сделали селект в одну базу и ответ положили в другую базу. Коннекты к базам настроены и написаны, могу делать селекты:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python3
import pyodbc
import configparser
 
config = configparser.ConfigParser()
config.readfp(open(r'/etc/zabbix/zabbix-python.conf'))
dsn = config.get('zabbix_postgresql','zabbix_p_dsn')
login = config.get('zabbix_postgresql','zabbix_p_login')
passw = config.get('zabbix_postgresql','zabbix_p_pass')
con_str = 'DSN=' + dsn + ';' + 'UID=' + login + ';' + 'PWD=' + passw
cnxn = pyodbc.connect(con_str)
cursor = cnxn.cursor()
for value in cursor.execute("select * from printer_report"):
    print(value)
cursor.close
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python3
import cx_Oracle
import configparser
 
config = configparser.ConfigParser()
config.readfp(open('/etc/zabbix/zabbix-python.conf'))
login = config.get('dwh_db','dwh_db_user')
passw = config.get('dwh_db','dwh_db_password')
db = config.get('dwh_db','dwh_db')
host = config.get('dwh_db','dwh_db_host')
con_str = login + '/' + passw + '@' + host + '/' + db
con = cx_Oracle.connect(con_str)
cur = con.cursor()
for value in cur.execute("select * from dht.val"):
    print(value)
cur.close
Но с питоном работаю впервые и не могу понять, как положить ответ от селекта в условно переменную, какой тип у нее должен быть, чтобы туда поместить все 3500 строк и 11 столбцов, для дальнейшей отправки. Либо построчно в цикле отправлять данные, но этот вариант мне кажется долгим. Как данные из этой переменной потом отправить в оракловвую базу, тут вопросы только по питону, любые скулевые команды не проблема.
Задача мне кажется простой, но в силу незнания питона она сильно усложняется для меня. Я делал такое на powershell довольно просто, там есть тип переменной datatable, в которую разом влазил весь ответ от селекта и так же разом отправлялся в другую базу. Но не хотелось бы тащить powershell в линукс, поэтому в приоритете питон. Конечно, если не смогу найти ответ, то все же притащу powershell на линукс. Надеюсь решение такого вопроса в несколько строк. Буду благодарен, если кто-нибудь сможет подсказать эти несколько строк!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2022, 19:43
Ответы с готовыми решениями:

Вызвать процедуру Oracle и отправить данные в Excel
Хочу вызвать процедуру ORACLe'a из VBA, и отправить данные в Excel. СТолкнулся с ошибкой:Run-time error '21472117900(80040e14)' ...

Данные из Excel отправить в БД Oracle при помощи SQL-запроса
Вот нашел тему, немного похожую на мою. Мне нужно данные из excel отправить в базу данных oracle при помощи sql-запроса, написанного в...

Из ORACLE в PostgreSQL
Подскажите плиззззз, раньше работал на ORACLE вот переметнулся на PostgreSQL. Вопрос такой вот проседура написанныя на ORACLE, как мне...

31
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
19.01.2023, 18:17  [ТС]
Цитата Сообщение от Alli_Lupin Посмотреть сообщение
у вас точно есть ограничение по объёму оперативной памяти
С озу нет проблем, 90гб в базе, с которой отправляем и скрипт на этой же машине(по мониторингу во время исполнения скрипта свободной озу еще гигов 20), на принимающей машине там вообще запредельные ресурсы, все же DWH. Нашел у to_sql параметр chunksize, выставил пока 5000, посмотрим, что получится.
Пока строка отправления выглядит так:
Python
1
df.to_sql('buf_printer_report', con=engine2, schema = 'VAL', index=False, if_exists='append', chunksize=5000)
0
5044 / 1071 / 149
Регистрация: 29.01.2013
Сообщений: 6,257
19.01.2023, 18:23
Griboed0ff, по параметрам панды я не подскажу. В глаза её не видел, мои интересы лежат несколько в другой стороне.
0
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
19.01.2023, 18:51  [ТС]
Я больше склоняюсь к тому, что когда панда пробует записать большой кусок, а кусок весит пример 25мб, он вообще ничем не занят, а просто висит. Так как по истечению часа, в принимающей базе ни строки.
0
5044 / 1071 / 149
Регистрация: 29.01.2013
Сообщений: 6,257
19.01.2023, 19:00
Логично, транзакция не закрыта же
0
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
19.01.2023, 20:05  [ТС]
Выводилась бы хоть какая-то информацию в консоль, а то и транзакция не закроется пока скрипт не закончится, а он может и не закончится так как висит. Вроде 25 метров это немного, но не могу понять, почему так долго.

Добавлено через 54 минуты
Опытным путем смог получить размер чанки, с которым загрузка 160к+ строк прошла за ~10 минут:
Python
1
df.to_sql('buf_printer_report', con=engine2, schema = 'VAL', index=False, if_exists='append', chunksize=500)
Но проблемы не закончились. А именно, to_sql меняет формат даты. pd.read_sql нормально получает дату в формате '2022-12-07', а to_sql записал '07-DEC-22', нужен либо исходный, а лучше '07.12.2022'.
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
19.01.2023, 21:18
В БД поле даты это дата или строка?
0
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
19.01.2023, 21:31  [ТС]
Цитата Сообщение от Lekks Посмотреть сообщение
В БД поле даты это дата или строка?
в бд поле тип дата, так же в панде сделал
Python
1
df = pd.read_sql(query, con_str, parse_dates=['date_values'])
и вместо object тип стал datetime64[ns]. Но не помогло. Думаю нужно сделать формат даты как в оракл ('07.12.2022') и он перестанет его отображать криво. Но все инструкции ведут как спарсить дату, и превратить в тип даты, а не как сменить формат. Есть ощущение, что нужен будет костыль типа воспринять поле как строку, изменить ее как надо, а потом отправить в базу как есть. Но пока силенок в пайтоне не хватает.
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
19.01.2023, 22:01
Лучший ответ Сообщение было отмечено Griboed0ff как решение

Решение

Python
1
df['date'] = df['date'].dt.strftime('%d.%m.%Y')
Так не?

Добавлено через 23 секунды
Только название столбца свое конечно
1
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
19.01.2023, 22:16  [ТС]
Цитата Сообщение от Lekks Посмотреть сообщение
Python
1
df['date'] = df['date'].dt.strftime('%d.%m.%Y')
Это работает! Спасибо!
Я почему то натыкался на такие примеры:
Python
1
2
3
4
df['Datetime'] = pd.to_datetime(df['Datetime'], format="%m/%d/%Y, %H:%M:%S")
df['Datetime'] = df['Datetime'].apply(lambda _: datetime.strptime(_,"%m/%d/%Y, %H:%M:%S"))
custom_datetime = lambda x: datetime.strptime(x, '%d%m%Y %H:%M:%S')
df = pd.read_csv('тест2.csv', parse_dates=['date'], date_parser=custom_datetime)
Видимо гуглить не умею! Надеюсь это все проблемы, которые были в этом маленьком скрипте.

Не по теме:

Интересно зачем многие пишут из этих простых строк функции? Это как-то лучше работает?

0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
20.01.2023, 09:06
Цитата Сообщение от Griboed0ff Посмотреть сообщение
Интересно зачем многие пишут из этих простых строк функции?
Если имеешь ввиду это

Цитата Сообщение от Griboed0ff Посмотреть сообщение
custom_datetime = lambda x: datetime.strptime(x, '%d%m%Y %H:%M:%S')
То эта функция применяет обработку в процессе чтения, а не после.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.01.2023, 20:25
Ну dblink ещё готовить уметь надо и скорее всего никто не даст оракловый сервер ребутить.

А как насчёт варианта сдампить таблицу в CSV и загрузить её мышкой через sql developer?
0
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
23.01.2023, 12:51  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
А как насчёт варианта сдампить таблицу в CSV и загрузить её мышкой через sql developer?
Видимо не совсем понимаю зачем, но скрипт работает по крону каждую ночь, со своими задачами справляется.
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Ну dblink ещё готовить уметь надо и скорее всего никто не даст оракловый сервер ребутить.
В этом мне как раз и отказали, поэтому скрипт + кронтаб.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.01.2023, 12:51

Из ORACLE в PostgreSQL
Люди, подскажите, перешел на Postgres столкнулся с трудностями. Вот функция на Oracle мне надо такую же написать на Postgrese, ...

Из Oracle в postgresql
Здравствуйте, подскажите пожалуйста, как мигрировать, конвертировать базы данных из Oracle в postgresql?

Java + Oracle(export)+PostgreSQL
Vsem dobrogo dnja . Ne podskagite ,kak bazu dannix Oracla exportirovat v PostgreSQL -ovskuju bazu . Zarannee blagodaren .

Не работает dblink из Oracle в postgreSQL
На одном серваке работают Oracle XE и PostgreSQL (Oracle XE 11g r2 / PostgreSQL 9.5 / odbc-postgresql 1:09.05.0400-1) При прокидывании...

Какими средствами Oracle экспортировать данные из таблицы Oracle в dbf-файл?
Здравствуйте! Не подскажите чайнику какими средствами Oracle экспортировать данные из таблицы Oracle в dbf-файл? Спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru