伙伴云是国内应用比较广泛的一个低代码平台,特别适合中小型企业使用,为了实现数据的自动更新,伙伴云里也提供了API接口来进行操作,但是官方范例只有代码片,对缺乏编程经验的新人来说,并不太友好。正好我司也在用这个平台,为了方便内部使用,把上传,更新,删除这几个动作做了封装,直接调用函数就可以了。
注意,这里调用了我自己封装的SQL_Server类,具体请点击
import pandas as pd
import SQL_Server
import requests
import json
import time
from decimal import Decimal
url = "https://api.huoban.com/openapi/v1/item"
headers = {
'Open-Authorization': '你自己的API KEY', # 换成你自己的API KEY
'User-Agent': 'Apifox/1.0.0 (https://www.apifox.cn)',
'Content-Type': 'application/json'
}
class Table:
"""
两个属性
table_id是表的ID,用于上传
sql_code是用于获取需要生成的sql语句
sleep是每次接口间隔时间,默认0.2秒
"""
def __init__(self, table_id='', sql_code='', sleep=0.2):
self.table_id = table_id
self.sql_code = sql_code
self.sleep = sleep
# 获取需要写入的数据,输出为dataframe格式
# def get_data(self):
# conn = SQL_Server.SqlServer() # 创建实例并连接SQL数据库
# conn.cursor.execute(self.sql_code)
# result = conn.cursor.fetchall() # 获取SQL数据
# data = pd.DataFrame(result, columns=[column[0] for column in conn.cursor.description])
# return data
# 如果含有时间序列,需要先进行转换,才能用于json,输出为dataframe格式
def get_sql_data(self, column_name=[], int_column=[]):
"""
如果含有时间序列,需要加上参数,先进行转换,才能用于json,输出为dataframe格式
:param column_name: 原本就是日期格式的,输入源数据中日期的列名进行转换,注意必须为列表格式,列表中的内容为列名
:param int_column: 原本是20220102格式的,使用int_column,注意必须为列表格式,列表中的内容为列名
:return: 返回转换后的数据
"""
conn = SQL_Server.SqlServer() # 创建实例并连接SQL数据库
conn.cursor.execute(self.sql_code)
result = conn.cursor.fetchall() # 获取SQL数据
data = pd.DataFrame(result, columns=[column[0] for column in conn.cursor.description])
for col_name, col_data in data.iteritems():
if isinstance(col_data.iloc[0], Decimal):
data[col_name] = col_data.apply(lambda x: float(x))
for col in column_name:
data[col] = data[col].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
for col in int_column:
data[col] = pd.to_datetime(data[col], format='%Y%m%d').dt.tz_localize('UTC')
data[col] = data[col].apply(lambda x: x.strftime('%Y-%m-%d'))
return data
# 上传数据
def upload_data(self, dataframe, mylist: list):
"""
:param dataframe: 需要上传的数据,应以pandas的dataframe的格式输入
:param mylist: 这个表的行ID的列表,必须是list格式, 顺序必须与表格相对应
:return: 返回上传状态
"""
# my_list是这个表的行ID的列表,必须是list格式,每条数据上传时间默认间隔0.2秒
dataframe.columns = mylist
dataframe.fillna(value=0, inplace=True)
for i in range(0, len(dataframe), 100):
batch = dataframe[i:i + 100]
data_list = batch.to_dict('records')
# print(range(len(my_list)))
# print({str(my_list[i]): row[r][i] for i in range(len(my_list))})
# print(data_list)
payload = json.dumps({
"table_id": self.table_id,
"items": data_list
})
time.sleep(self.sleep)
response = requests.request("POST", f'{url}s', headers=headers, data=payload)
print('upload ' + response.text)
def get_item(self, offset=2000):
item_ids = []
# item是每个字段对应的编码,有了item ID,才能对表格内的字段进行操作
"""
:param offset: 每次可以获取100行数据,如果超过100行,就需要翻页,需要事先了解文件有多少行,填入行数
:return: 返回一个列表,存储item id
"""
url1 = "https://api.huoban.com/openapi/v1/item/list"
for i in range(0, offset, 100):
time.sleep(self.sleep)
payload = json.dumps({
"table_id": self.table_id,
"filter": {
"and": [
{
"field": "2200000137788634",
"query": {
"gte": 100
}
},
{
"field": "2200000137788650",
"query": {
"eq": [
"1"
]
}
}
]
},
"order": {
"field_id": "created_on",
"type": "desc"
},
"limit": 100,
"offset": i,
"with_field_config": 0
})
response = requests.request("POST", url1, headers=headers, data=payload)
data = json.loads(response.text)
print(i)
item_ids += [item['item_id'] for item in data['data']['items']]
return item_ids
def del_data(self, item_ids):
item_ids = item_ids
for i in range(0, len(item_ids)+1, 1000):
batch = item_ids[i:i + 1000]
# print(batch)
payload = json.dumps({
"table_id": self.table_id,
"item_ids": batch})
response = requests.request("DELETE", f'{url}s', headers=headers, data=payload)
time.sleep(self.sleep)
print('del ' + response.text)
def get_hby_data(self, col):
"""
:param col: 是一个列表,里面是要生成的表格的标题,标题的顺序应该与表格中数据的数据一致
:return: 返回一个dataframe格式的数据
"""
data = []
for i in self.get_item():
time.sleep(self.sleep)
payload = {}
response = requests.request("POST", f'{url}/{i}', headers=headers, data=payload)
field = json.loads(response.content)
# print(data)
items = field['data']['item']['fields']
# print(items)
data.append(items)
get_df = pd.DataFrame(data)
get_df.columns = col
return get_df
if __name__ == '__main__':
# 以下是上传SQL数据的示例代码
code = '''
你自己的SQL代码
'''
up = Table('2100000040904978', code) # 创建Table实例,第一个参数是table的ID,第二个参数是sql代码
my_list = ['2200000326449035', '2200000326449036', '2200000326449037', '2200000326449038'] # Table里的行ID
# 原本就是日期格式的,使用column_name,原本是20220102格式的,使用int_column,注意必须为列表格式,列表中的内容为列名
df = up.get_sql_data(column_name=['创建时间'], int_column=[])
up.upload_data(df, my_list)
# 以下是获取数据的测试代码
get_hyb = Table('2100000041315626') # 建立一个对象
# title = ['date', 'PayStage', 'shop_id', '数量', '付款金额', '退款金额', 'converted_shop']
# print(get_hyb.get_item(10000))
item_id = get_hyb.get_item(2000)
# 以下是删除数据的测试代码
get_hyb.del_data(item_ids=item_id)
# 以下是从excel或csv文件源上传的测试代码
test_df = pd.read_csv(r'C:\Users\Administrator\Desktop\临时文件\hby_upload_test.csv') # 读取上传文件
test_list = ['2200000329579419', '2200000329579420', '2200000329579421', '2200000329579423', '2200000329579424',
'2200000329579425', '2200000329579426'] # 上传文件的列id
get_hyb.upload_data(test_df, test_list)