Как определить тип данных столбца PostgreSQL на основе типов данных numpy? - PullRequest
0 голосов
/ 28 апреля 2019

На стороне Python у меня есть список сигналов, каждый сигнал является numpy.ndarray.

Среди сигналов изменяется тип d - включая numpy.uint8, numpy.uint16, numpy.uint32, numpy.float64 и numpy.bytes_.

В конечном итоге я хотел бы передать сигналы в таблицу в PostgreSQL, каждый из которых является столбцом. Теперь я застрял на этапе ADD COLUMN, так как требуется указать тип данных для каждого столбца в PostgreSQL.

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

Моя идея / подход заключалась бы в том, что, учитывая, что среди имеющихся у меня сигналов всего 5 dtype, я могла бы:

  1. перебрать список сигналов
  2. получить первый элемент каждого сигнала, найти его dtype
  3. определить соответствующий тип данных PostgreSQL для каждого сигнала
  4. создать соответствующий список типов данных PostgreSQL
  5. использовать сгенерированный список для передачи типов данных при добавлении столбцов

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

Спасибо за любые идеи!

1 Ответ

0 голосов
/ 24 мая 2019

Это совсем не элегантно, но в итоге я использовал этот метод:

Считайте type() первого элемента в каждом сигнале и преобразуйте его в str, который позже передается функции, чтобы в основном соответствовать соответствующему типу данных PostgreSQL. Обратите внимание, что охватываются только numpy типы данных, относящиеся к моему проекту.

def db_data_type(data_type):
    # Input is string of data type
    conversion_table = {
        "<class 'numpy.uint8'>":    'int2',     # 0 to 255          # -32768 to 32767
        "<class 'numpy.uint16'>":   'int4',     # 0 to 65535        # -2147483648 to 2147483647
        "<class 'numpy.uint32'>":   'int8',     # 0 to 4924967295   # -9223372036854775808 to 9223372036854775807
        "<class 'numpy.int8'>":     'int2',     # -128 to 127
        "<class 'numpy.int16'>":    'int2',     # -32768 to 32767
        "<class 'numpy.int32'>":    'int4',     # -2147483648 to 2147483647
        "<class 'numpy.float64'>":  'float8',   # double
        "<class 'numpy.bytes_'>":   'text',
    }
    return conversion_table[data_type]

В основном, когда я перебираю группу сигналов (столбцы в таблице базы данных), я получаю список имен сигналов (имена столбцов в БД) и список типов данных (типы данных столбцов в БД). А вот код для psycopg2 для генерации SQL-запроса:

def db_create_columns(conn, table, columns, types):
    cur = conn.cursor()
    for i in range(len(columns)):
        sql_add_column = psycopg2.sql.SQL("""ALTER TABLE {} ADD COLUMN {} {} ;""") \
            .format(psycopg2.sql.Identifier(table),
                    psycopg2.sql.Identifier(columns[i]),
                    psycopg2.sql.Identifier(types[i]))
        try:
            cur.execute(sql_add_column)
        except Exception as e:
            print('Error occurred when adding data column [%s].\n%s' % (columns[i], e))
    cur.close()
    conn.commit()
    return

Здесь аргументы функции: подключение к БД, имя таблицы, список имен столбцов, список типов данных.

Если есть лучший способ сделать это, пожалуйста, не стесняйтесь указывать. Я был бы очень признателен.

...