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

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

21.12.2022, 19:43. Показов 2382. Ответов 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
5184 / 1074 / 150
Регистрация: 29.01.2013
Сообщений: 6,263
19.01.2023, 18:23
Griboed0ff, по параметрам панды я не подскажу. В глаза её не видел, мои интересы лежат несколько в другой стороне.
0
0 / 0 / 0
Регистрация: 29.03.2022
Сообщений: 41
19.01.2023, 18:51  [ТС]
Я больше склоняюсь к тому, что когда панда пробует записать большой кусок, а кусок весит пример 25мб, он вообще ничем не занят, а просто висит. Так как по истечению часа, в принимающей базе ни строки.
0
5184 / 1074 / 150
Регистрация: 29.01.2013
Сообщений: 6,263
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
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru