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

Проблема с unixODBC decoding with 'utf-16le'

07.07.2022, 12:14. Показов 575. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!
Есть организованный ETL процесс, который написан на Python и успешно работает на Window.
Забираю данные с базы данных и записываю их после обработки в DWH.
Захотел перевести этот процесс на Apache Airflow, чтобы запускать сразу несколько процессов одновременно,
а не one by one.
И тут проблема - запускаю Airflow на образе докера на Ubuntu. И через раз выбивает ошибка

Python
1
2
3
4
5
6
7
8
9
File "/usr/lib/python3.8/encodings/utf_16_le.py", line 15, in decode
    def decode(input, errors='strict'):
  File "/usr/local/lib/python3.8/dist-packages/airflow/models/taskinstance.py", line 1543, in signal_handler
    raise AirflowException("Task received SIGTERM signal")
airflow.exceptions.AirflowException: Task received SIGTERM signal
 
The above exception was the direct cause of the following exception:
 
airflow.exceptions.AirflowException: decoding with 'utf-16le' codec failed (AirflowException: Task received SIGTERM signal)
Я похоже нашел решение. Вот код решения, которое одобрено в сети:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def decode_sketchy_utf16(raw_bytes):
    s = raw_bytes.decode("utf-16le", "ignore")
    try:
        n = s.index('\u0000')
        s = s[:n]  # respect null terminator
    except ValueError:
        pass
    return s
 
# ...
 
prev_converter = cnxn.get_output_converter(pyodbc.SQL_WVARCHAR)
cnxn.add_output_converter(pyodbc.SQL_WVARCHAR, decode_sketchy_utf16)
col_info = crsr.columns("Clients").fetchall()
cnxn.add_output_converter(pyodbc.SQL_WVARCHAR, prev_converter)  # restore previous behaviour
Но все никак не могу это реализовать в своем коде! Помогите, куда имплементировать это в мой код ETL:


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
--- connecting to DWH
def dwh_conn():
    mySQL = '192.168.240.1'
    myDB = 'DWH'
    login = 'sa'
    PWD = '...'
    Encrypt = 'No'
    Certificate = 'Yes'
 
    params = urllib.parse.quote_plus("DRIVER={ODBC Driver 18 for SQL Server};"
                                     "SERVER=" + mySQL + ";"
                                                         "SERVER=" + mySQL + ";"
                                                                             "Port=1433" + ";"
                                                                                           "DATABASE=" + myDB + ";"
                                                                                                                "UID=" + login + ";"
                                                                                                                                 "PWD=" + PWD + ";"
                                                                                                                                                "Encrypt=" + Encrypt + ";"
                                                                                                                                                                       "TrustServerCertificate=" + Certificate + ";")
    engine = sa.create_engine('mssql+pyodbc:///?odbc_connect={}?charset=utf8mb4'.format(params), fast_executemany=False)
    return engine
 
--- connecting to database to get data
def gladiator_conn():
    mySQL = '...'
    myDB = '...'
    login = '...'
    PWD = '...'
    Encrypt = 'No'
    Certificate = 'Yes'
    params = urllib.parse.quote_plus("DRIVER={ODBC Driver 18 for SQL Server};"
                                     "SERVER=" + mySQL + ";"
                                                         "Port=1433" + ";"
                                                                       "DATABASE=" + myDB + ";"
                                                                                            "UID=" + login + ";"
                                                                                                             "PWD=" + PWD + ";"
                                                                                                                            "Encrypt=" + Encrypt + ";"
                                                                                                                                                   "TrustServerCertificate=" + Certificate + ";")
    engine = sa.create_engine('mssql+pyodbc:///?odbc_connect={}?charset=utf8mb4'.format(params), fast_executemany=False)
    return engine
 
---example of getting data and inserting into DWH 
def update_from_gladiator_ost(market_id):    
    query = "DELETE from [stage].[dbo].[rests_by_docs_temp] where market_id = %d" % market_id
    execute_query_dwh(query)
    engine = dwh_conn()
    connection = engine.raw_connection()
    abc = connection.cursor()
    # abc.execute("DELETE from [stage].[dbo].[sell_movement_temp]; DELETE from [stage].[dbo].[rests_by_docs_temp]")
    df_op = pd.read_sql(
            "SET NOCOUNT ON exec [dbo].[mp_report_finance_agent_enhanced_basis_transport_royalty_NC_ost_by_docs4] @pmarket_id = %d, @pstart_date = '%s', @pend_date = '%s', @pselect = '1'" % (
            market_id, z, w), gladiator_conn())
    df_op = df_op.fillna(value=0)
    for row_count in range(0, df_op.shape[0]):
        chunk = df_op.iloc[row_count:row_count + 1, :].values.tolist()
        tuple_of_tuples = tuple(tuple(x) for x in chunk)
        abc.executemany(
                "insert into stage.dbo.rests_by_docs_temp" + " ([date_start],[market_id],[good_id],[agent_id],[doc_id],[tstart_qty],[tstart_amt],[IMP],[doc_name]) values   (?,?,?,?,?,?,?,?,?)",
                tuple_of_tuples)
        abc.commit()
    connection.close()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.07.2022, 12:14
Ответы с готовыми решениями:

getBytes('UTF-16') даёт UTF-16LE или UTF-16BE?
Добрый день! Делаю J2ME-клиента к некому серверу, исходников которого у меня нет, но есть работающий клиент на C#. Выяснилось, что C#...

Осуществить перекодирование текста в 'UTF-16LE'
Дана текстовая строка с произвольным текстом. Осуществить перекодирование текста в 'UTF-16LE' Примеры: Ввод: Участие в Олимпиаде ...

Как правильно вывести файл в кодировке UTF-16LE?
Друзья! НА самом-то деле я всё правильно делаю. Вот код: import codecs f = codecs.open ("foo.txt", 'r', "UTF-16LE") ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.07.2022, 12:14
Помогаю со студенческими работами здесь

Как создать рабочий XML в UTF-8? У меня исправно создаётся Windows-1251, но с UTF-8 проблема
Доброго дня, форумчане. Подскажите, что делать, чтобы создавался и открывался без ошибок XML-файл? Сейчас у меня такой код и если...

<globalization fileEncoding='utf-8' requestEncoding='utf-8' responseEncoding='utf-8' />
Если в коде пишу строку скажем Response.Write ('Вася дурак') - все срабатывает нормально, а если в &lt;body&gt;&lt;h1&gt;Вася...

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32
Собсно сабж.

Проблема с кодировкой. aspSmartUpload + UTF
Был чудесный скрипт который аплоадил форму (файл+текст) через aspSmartUpload (www.aspsmart.com), текст хранится в БД. Потребовалось...

Проблема с INI-файлом в кодировке UTF-8
Извиняюсь за поднятие темы, но возникла проблема с ini файлом в кодировке utf-8 Никто с такими не сталкивался? Хотел написать...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru