伙伴云_本地SQL与伙伴云API接口链接实战_表格操作

6 篇文章 0 订阅
5 篇文章 0 订阅

伙伴云是国内应用比较广泛的一个低代码平台,特别适合中小型企业使用,为了实现数据的自动更新,伙伴云里也提供了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)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White_Mountain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值