Как более эффективно вставить данные ответа json в базу данных снежинок? - PullRequest
0 голосов
/ 24 января 2020

Я в настоящее время перебираю ответ json и вставляю каждую строку одну за другой.

Это очень медленно даже для нескольких тысяч строк вставки данных.

Какой самый эффективный способ вставить данные?

Вот мой код.

from module import usr, pwd, acct, db, schem, api_key
import snowflake.connector
import datetime

end_point = 'users'

def snowflake_connect():
    global cursor, mydb
    mydb = snowflake.connector.connect(
        user=usr,
        password=pwd,
        account=acct,
        database=db,
        schema=schem,
    )

def snowflake_insert(id, activated, name):
    global cursor
    snowflake_connect()
    cursor = mydb.cursor()
    sql_insert_query = """ INSERT INTO USERS(ID, ACTIVATED, NAME) VALUES (%s, %s, %s)"""
    insert_tuple = (id, activated, name)
    cursor.execute(sql_insert_query, insert_tuple)
    return cursor

def get_users():
    url = 'https://company.pipedrive.com/v1/{}?&api_token={}'.format(end_point,api_key)
    response = requests.request("GET", url).json()
    read_users(response)

def read_users(response):   
    for data in response['data']:
        id = data['id']
        activated = data['activated']
        name = data['name']     
        snowflake_insert(id, activated, name)

if __name__ == "__main__":  
    snowflake_truncate()
    get_users()
cursor.close()

1 Ответ

1 голос
/ 26 января 2020

Как отметили другие в комментариях , чтобы получить максимальную эффективность, особенно при постоянной загрузке, загрузите ваши отформатированные файлы данных непосредственно в Snowflake вместо использования INSERT операторов в качестве лучшей практики.

Однако код в описании также может быть улучшен, чтобы минимизировать накладные расходы, создаваемые для каждой вставленной строки. Несколько ключевых наблюдений:

Модифицированная версия кода:

from module import usr, pwd, acct, db, schem, api_key
import snowflake.connector
import datetime

end_point = 'users'
MYDB = None

def snowflake_connect():
    if MYDB is None:
        MYDB = snowflake.connector.connect(
            user=usr,
            password=pwd,
            account=acct,
            database=db,
            schema=schem,
        )

def snowflake_insert_all(rows):
    snowflake_connect()
    cursor = MYDB.cursor()
    sql_insert_query = "INSERT INTO USERS(ID, ACTIVATED, NAME) VALUES (?, ?, ?)"
    cursor.executemany(sql_insert_query, rows)
    return cursor

def get_users():
    url = 'https://company.pipedrive.com/v1/{}?&api_token={}'.format(end_point,api_key)
    response = requests.request("GET", url).json()
    read_users(response)

def read_users(response):
    # 
    all_data = [(data['id'], data['activated'], data['name']) for data in response['data']]
    snowflake_insert_all(all_data)

if __name__ == "__main__":  
    snowflake_truncate()
    get_users()
    if MYDB is not None:
      MYDB.close()

Примечание : я сосредоточился только на улучшении частей взаимодействия Snowflake и DB-API, но в целом есть и другие ошибки (переменная и именование методов, ненужное использование глобальных переменных, обработка ресурсов и т. д. c.) в том, как написан этот скрипт, который может использовать справку из Code Review , если вы хотите улучшить свою программу дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...