0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41

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

21.12.2022, 19:43. Показов 2454. Ответов 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
5189 / 1079 / 151
Регистрация: 29.01.2013
Сообщений: 6,269
19.01.2023, 18:23
Griboed0ff, по параметрам панды я не подскажу. В глаза её не видел, мои интересы лежат несколько в другой стороне.
0
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
19.01.2023, 18:51  [ТС]
Я больше склоняюсь к тому, что когда панда пробует записать большой кусок, а кусок весит пример 25мб, он вообще ничем не занят, а просто висит. Так как по истечению часа, в принимающей базе ни строки.
0
5189 / 1079 / 151
Регистрация: 29.01.2013
Сообщений: 6,269
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru