Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在snowflake数据库中更有效地插入json响应数据?_Python_Json_Python 3.x_Etl_Snowflake Cloud Data Platform - Fatal编程技术网

Python 如何在snowflake数据库中更有效地插入json响应数据?

Python 如何在snowflake数据库中更有效地插入json响应数据?,python,json,python-3.x,etl,snowflake-cloud-data-platform,Python,Json,Python 3.x,Etl,Snowflake Cloud Data Platform,我目前正在循环一个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 = snowflak

我目前正在循环一个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()
如所述,要获得最高的效率,尤其是对于连续加载,请将格式化数据文件直接加载到Snowflake中,而不是使用
INSERT
语句作为最佳做法

但是,还可以进一步改进描述中的代码,以最大限度地减少每个插入行产生的开销。以下几点关键意见:

  • 每次插入时,代码都会创建一个新的
    连接
    对象,这是不必要的
  • 由于目的是只运行不需要隔离的
    INSERT
    语句,因此
    游标
    对象
  • 每个
    INSERT
    语句可以发送多个值,或者使用更简单的方式表示
  • 切换到使用
    qmark(?)
    参数格式设置
修改后的代码版本:

从模块导入usr、pwd、acct、db、schem、api\U密钥
导入snowflake.com连接器
导入日期时间
端点='用户'
MYDB=无
def雪花_connect():
如果MYDB为无:
MYDB=snowflake.connector.connect(
用户=usr,
密码=pwd,
账户=账户,
数据库=db,
schema=schem,
)
def雪花_插入_全部(行):
雪花连接
cursor=MYDB.cursor()
sql_insert_query=“插入用户(ID、激活、名称)值(?、、?)”
cursor.executemany(sql\u insert\u查询,行)
返回光标
def get_users():
url='1〕https://company.pipedrive.com/v1/{}?&api_标记={}。格式(端点,api_键)
response=requests.request(“GET”,url).json()
读取用户(响应)
def read_用户(响应):
# 
所有_data=[(数据['id']、数据['activated']、数据['name'])用于响应中的数据['data']]
雪花\u插入\u全部(所有\u数据)
如果名称=“\uuuuu main\uuuuuuuu”:
雪花_截断()
获取用户()
如果MYDB不是无:
MYDB.close()

注意:我只着重于改进Snowflake和DB-API交互部分,但一般来说,在编写此脚本的方式中存在其他缺陷(变量和方法命名、不必要地使用全局变量、资源处理等),这些缺陷可以从,如果您希望进一步改进程序。

请查看
复制到
命令。这里有一条来自雪花支持论坛的关于这个确切过程的线索。确切地说,暂存json文件然后将其复制到表中可以节省大量时间。在文档中加载半结构化数据引用是我推荐的另一个资源。尤其是扁平化和变异