如何用Python将TikTok API返回的数组写入Snowflake数据库?
解决TikTok API数组完整写入Snowflake的问题
问题根源
- 代码里用
ad_group['age_groups'][0]只取了数组第一个元素,导致存储不完整 - INSERT语句语法错误,列名列表后未闭合括号
executemany放在循环内部,会重复插入已有数据
修复步骤&代码
1. 修正数组取值逻辑
直接获取整个age_groups数组,不要取索引0的元素:
age_groups = ad_group.get('age_groups') # 空数组会返回None,符合Snowflake VARIANT存储要求
2. 修复SQL语法错误
补上INSERT语句中列名列表的闭合括号:
INSERT INTO {adGroup_table} ( adgroup_app_profile_page_state, adgroup_id, adgroup_name, advertiser_id, age_groups ) VALUES ( %s, %s, %s, %s, %s)
3. 调整批量插入执行时机
把executemany和commit移到循环外面,避免重复插入:
修改后的完整代码
if ad_group_data and 'list' in ad_group_data['data']: ad_group_list = ad_group_data['data']['list'] adGroup_table = 'ADGROUP' adGroup_insert_query = f''' INSERT INTO {adGroup_table} ( adgroup_app_profile_page_state, adgroup_id, adgroup_name, advertiser_id, age_groups ) VALUES ( %s, %s, %s, %s, %s) ''' adGroup_data_to_insert = [] for ad_group in ad_group_list: # 用get方法简化取值,不存在则返回None adgroup_app_profile_page_state = ad_group.get('adgroup_app_profile_page_state') adgroup_id = ad_group.get('adgroup_id') adgroup_name = ad_group.get('adgroup_name') advertiser_id = ad_group.get('advertiser_id') age_groups = ad_group.get('age_groups') # 直接获取完整数组 adgroup_data_tuple = ( adgroup_app_profile_page_state, adgroup_id, adgroup_name, advertiser_id, age_groups ) adGroup_data_to_insert.append(adgroup_data_tuple) # 所有数据准备好后批量插入,再提交事务 cursor.executemany(adGroup_insert_query, adGroup_data_to_insert) conn.commit()
4. 确认Snowflake列类型
确保ADGROUP表的age_groups列是VARIANT类型,若未设置,执行以下SQL修改:
ALTER TABLE ADGROUP ALTER COLUMN age_groups SET DATA TYPE VARIANT;
这样就能把完整的年龄分组数组存入Snowflake了。
内容的提问来源于stack exchange,提问作者gourav
相关产品推荐
相关产品推荐

