Python 如何在snowflake数据库中更有效地插入json响应数据?
我目前正在循环一个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
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文件然后将其复制到表中可以节省大量时间。在文档中加载半结构化数据引用是我推荐的另一个资源。尤其是扁平化和变异