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

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

Схема с именем raw_data, заполненная произвольным и увеличивающимся числом таблиц, связанных с измерениями, выполненными в разных местах:

  • area1 (timestamp, value)
  • area2 (timestamp, value)
  • area3 (timestamp, value)
  • ...

Каждая таблица состоит из двух столбцов timestamp и value. Новые данные постоянно добавляются в каждую таблицу. Таблица создается с использованием следующего кода на Python с использованием psycopg2 с активным подключением con к базе данных:

    table_name = schema_name + '.' + table_name.lower()
    sql = ('CREATE TABLE ' + table_name + ' ('
           'timestamp varchar (19) PRIMARY KEY, '
           'value numeric (5,2) NOT NULL, '
           ');')
    try:
        cur = con.cursor()
        cur.execute(sql)
        con.commit()
    except psycopog2.Error as e:
        con.rollback()
        print(e)
    finally:
        cur.close()

Моя цель - провести «живой» (выполняется, как только новые значения вставляются в таблицу в схеме raw_data) анализ (вычисления) данных, которые доступны в каждой таблице в raw_data схемы, но я также заинтересован в том, чтобы не изменять таблицы в raw_data, так как позже я планирую выполнить несколько «живых» анализов с помощью разных методов, все на основе данных в таблицах в raw_data . Поэтому я хотел бы создать схему (названную method1), которая автоматически генерирует таблицы внутри себя на основе таблиц, присутствующих в схеме raw_data.

Если возможно, я бы также хотел, чтобы новые таблицы заполнялись указанным количеством строк из столбца (timestamp), а также значениями, которые были вычислены из столбца (value) в raw_data стол.

Возможно ли это вообще, или следует придерживаться извлечения данных, выполнения вычислений и повторной вставки с использованием python и psycopg2?

Я хотел бы заранее извиниться, если я не понимаю, как я использую технические термины, поскольку я не проходил формального обучения SQL или Python.

Спасибо, что нашли время прочитать мой вопрос!

0
Brian Bjarke Jensen 20 Июн 2020 в 19:49

1 ответ

Лучший ответ

Вы можете создать новую таблицу, используя:

https://www.postgresql.org/docs/current/sql-createtableas.html

Общий пример ниже:

CREATE TABLE AS 
   another_schema.new_table 
SELECT ... FROM 
    some_schema.existing_table 
WHERE
    specify conditions
LIMIT
    14400  

Не уверен, применимо ли здесь, но есть метод SAMPLING для извлечения данных:

https://www.postgresql.org/docs/current/sql-select.html

TABLESAMPLE sampling_method (аргумент [, ...]) [REPEATABLE (seed)]

0
Adrian Klaver 20 Июн 2020 в 18:30