复购率 mysql 实例(sample database classicmodels _No.1 )

复购率 mysql 实例

准备工作,可以去下载 classicmodels 数据库具体如下
点击:classicmodels

也可以去 下面我的博客资源下载
https://download.youkuaiyun.com/download/tomxjc/88685970

用的是 MySQL 8.0

前言

什么是复购率?,以下是百度百科查的结果

复购率有叫 重复购买率, 大家也可以去百度百科查 重复购买率的定义。

指消费者对该品牌产品或者服务的重复购买次数,重复购买率越多,则反应出消费者对品牌的忠诚度就越高,反之则越低。
重复购买率有两种计算方法:
一种是所有购买过产品的顾客,以每个人人为独立单位重复购买产品的次数,比如有10个客户购买了产品,5个产生了重复购买,则重复购买率为50%;

第二种,按交易计算,即重复购买交易次数与总交易次数的比值,如某月内,一共产生了100笔交易,其中有20个人有了二次购买,这20人中的10个人又有了三次购买,则重复购买次数为30次,重复购买率为30%。

推荐企业采取第一种算法。这里就介绍第一种

一、数据准备

select * FROM  classicmodels.orders

在这里插入图片描述

二、复购率计算步骤

1.窗口函数计算首次购买日期

代码如下(示例):

SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders

2.第2次购买间隔天数,月份数

代码如下(示例),这个就可以看到date_diff不是0的都是复购的订单:

select DISTINCT customerNumber as'user_id' , -- 客户编号
order_date , -- 购买日期 
first_orderdate , -- 首次购买日期
DATEDIFF(order_date, first_orderdate) date_diff ,  -- 首购后,再次购买间隔天数 
(year(order_date)-year(first_orderdate))*12+ (month(order_date)-month(first_orderdate)) month_diff -- 首购后,再次购买间隔月份数
          from (
SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders
          ) a 

在这里插入图片描述

3.每个客户编号的复购次数

select user_id,count(user_id) from (

select DISTINCT customerNumber as'user_id' , -- 客户编号
 order_date , -- 购买日期 
first_orderdate , -- 首次购买日期
DATEDIFF(order_date, first_orderdate) date_diff ,  -- 首购后,再次购买间隔天数 
(year(order_date)-year(first_orderdate))*12+ (month(order_date)-month(first_orderdate)) month_diff -- 首购后,再次购买间隔月份数
from (
SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders
) a   where  DATEDIFF(order_date, first_orderdate)>0
) b group by user_id order by count(*)

在这里插入图片描述

4.复购次数汇总

说明下这里统计周期比较长是按照 2003-01-06~2005-05-31 时间统计
具体可以根据按时间统计
select 
count(if(复购次数=1,user_id,null)) as '复购次数1次客户人数',
count(if(复购次数=2,user_id,null)) as '复购次数2次客户人数',
count(if(复购次数=3,user_id,null)) as '复购次数3次客户人数',
count(if(复购次数=4,user_id,null)) as '复购次数4次客户人数',
count(if(复购次数>4,user_id,null)) as '复购次数大于4次客户人数'

from 
(
select user_id,count(user_id) as '复购次数' from (
          select DISTINCT customerNumber as'user_id' , -- 客户编号
          order_date , -- 购买日期 
          first_orderdate , -- 首次购买日期
           DATEDIFF(order_date, first_orderdate) date_diff ,  -- 首购后,再次购买间隔天数 
           (year(order_date)-year(first_orderdate))*12+ (month(order_date)-month(first_orderdate)) month_diff -- 首购后,再次购买间隔月份数
from (
SELECT customerNumber, -- 客户编号
DATE(orderDate)  as order_date, -- 购买日期
min(DATE(orderDate)) OVER (PARTITION BY customerNumber) AS first_orderdate  -- 首次购买日期
FROM  classicmodels.orders
          ) a   where  DATEDIFF(order_date, first_orderdate)!=0
          ) b
group by user_id 
) c

最后方便大家理解
select count(distinct customerNumber) FROM classicmodels.orders 有 98人
有复购行为的 有 97 人 .
有一个人在2003-01-06~2005-05-31 之间只买了一次没有复购
所以如果按这个时间段算(2003-01-06~2005-05-31 ) 复购率是 97/98=98%

总结

很多行业对复购率还是比较看重的,是一个重要的指标 。比如互联网,比如医美,比如快消等。希望对大家有帮助,有不足之处也请指出。

修改脚本功能: 1.原逻辑中需要从表中取相关信息,修改为磁盘价格从本地json文件获取 2.实例价格修改为从云厂商接口获取后直接计算,取折后价格,并且云接口所需参数需要从实例列表返回后传入,比如腾讯所需的镜像id等参数,其他云也类似 3.只有最终结果asktao_dist_price和dist_list区组对照表和gs_info,其余不再入库,如果必须使用,写入本地json HuaWei SAS 0.35 HuaWei STAT 0.3 HuaWei SSD 1 Tencent CLOUD_BASIC 0.3 Tencent CLOUD_PREMIUM 0.35 Tencent CLOUD_SSD 1.1 AliCloud cloud 0.3 AliCloud cloud_efficiency 0.35 AliCloud cloud_ssd 1 AliCloud cloud_essd 1 Tencent CLOUD_BSSD 0.5 Tencent CLOUD_TSSD 0.65 Tencent CLOUD_HSSD 0.65 Volcengi ESSD_PL0 0.65 3.最终费用仍为实例价格+磁盘价格,不计算打折部分,价格直接是折后的 main.py -------- #_*_coding:utf-8_*_ from cloud import alicloud from cloud import tencent from cloud import huawei from cloud import volcengine import json import sys import MySQLdb as pymysql import datetime import time from decimal import Decimal if sys.version_info.major == 3: import urllib.request as urllib2 from functools import reduce else: import urllib2 reload(sys) sys.setdefaultencoding('utf-8') remove_dist = [-200, 11, 12, 35, 1, -100, 258, 259, 368, 20004, 440, 444, 10000] db_config = { "charset": "utf8", "db": "game_server_price", "host": "10.14.101.113", "passwd": "NGI", "port": 30001, "user": "grafana", } center_db_config = { "charset": "utf8", "db": "dw_game_wd", "host": "10.14.50.2", "passwd": "GW09iO", "port": 3306, "user": "ops_read", } def mysql_conn(sql, values_list=[], **config): try: conn = pymysql.connect(**config) cursor = conn.cursor() if values_list: cursor.executemany(sql, values_list) else: cursor.execute(sql) conn.commit() except Exception as e: print(e) #print(sql) sys.exit(e) conn.close() return cursor.fetchall() def get_online_number(): # 查询当月每日最大人数求平均值,去除最大值小于100的项,当新服未开放时无法查询出新服,后续使用try处理 # 去除最大值小于100项目用于解决问题:新服开放当月平均值会被开服前的0平均掉 sql = "select" \ " dist,avg(cnt_max) from dw_game_wd.fact_online_day " \ "where" \ " DATE_FORMAT( log_date, '%Y%m' ) = DATE_FORMAT( CURRENT_DATE, '%Y%m' ) and cnt_max > 100 group by dist;" result = mysql_conn(sql, **center_db_config) online_info = {} for dist in result: online_info[dist[0]] = dist[1] return online_info def get_servers(): all_servers_list = [] all_disks_list = [] #cloud_list = [huawei, alicloud, tencent, volcengine] cloud_list = [volcengine] for cloud in cloud_list: instances = cloud() result_cloud = instances.run_cloud() server_list = result_cloud["instences"] disk_list = result_cloud["disks"] if not server_list: continue all_servers_list = all_servers_list + server_list if not disk_list: continue all_disks_list = all_disks_list + disk_list mysql_conn("delete from game_server_price.disk_info where date=CURRENT_DATE;", **db_config) mysql_conn("delete from game_server_price.instances_info where date=CURRENT_DATE;", **db_config) values_list = [] for instance in all_servers_list: name = instance['name'] ip = instance['ip'] instance_type = instance['instance_type'] company = instance['company'] id = instance['id'] values_list.append([name, ip, instance_type, company, id]) sql = 'insert into game_server_price.instances_info value (%s,%s,%s,%s,%s,CURRENT_DATE)' mysql_conn(sql, values_list, **db_config) sql = 'insert into game_server_price.disk_info value (%s,%s,%s,%s,%s,0,CURRENT_DATE)' mysql_conn(sql, all_disks_list, **db_config) return all_servers_list def get_ucenter_info(mainid=2): ucurl = "http://creator-sre.gyyx.cn/app_ass_info?main_id=%s" % (mainid) result_url = urllib2.urlopen(ucurl, timeout=30) result_url_data = result_url.read() alldata = json.loads(result_url_data)['data'] #alldata = json.loads(result_url_data) dist_info_list = [] tmp_info = {} for data in alldata: if data['app_name'] in ['ldb_s', 'ldb', 'stat'] or int(data['dist_id']) in remove_dist: continue ip = data['ass_ip'] dist_id = data['dist_id'] name = data['ass_gysn'] if not name: print(data) app_name = data['app_name'] if app_name == "LB":continue disk_size_setting = data['setting'].replace('G', '').replace(' ', '').split("+")[1:] if disk_size_setting == []: disk_size = 0 else: disk_size = reduce(lambda x, y: x + y, map(int, disk_size_setting)) dist_info_list.append([dist_id, name, app_name, ip, disk_size]) tmp_info[data['ip']] = name line_info_list = [] ucurl_line = 'http://creator-sre.gyyx.cn/gamelinelist?mainid=2' result_url = urllib2.urlopen(ucurl_line, timeout=30) result_url_data = result_url.read() alldata = json.loads(result_url_data)['data'] #alldata = json.loads(result_url_data) for dist in alldata: if int(dist['dist_id']) in remove_dist or int(dist['dist_id']) > 10000: continue dist_id = int(dist['dist_id']) name = tmp_info[dist['ip']] line_num = len(dist['line_nums'].split(',')) line_info_list.append([dist_id, name, line_num]) mysql_conn("delete from game_server_price.gs_info where date=CURRENT_DATE;", **db_config) gs_info_sql = 'insert into game_server_price.gs_info value (%s,%s,%s,current_date);' mysql_conn(gs_info_sql, line_info_list, **db_config) mysql_conn("delete from game_server_price.instances_center where date=CURRENT_DATE;", **db_config) mysql_conn("truncate table game_server_price.dist_list;", **db_config) sql = 'insert into game_server_price.instances_center value (%s,%s,%s,%s,%s,CURRENT_DATE)' mysql_conn(sql, dist_info_list, **db_config) sub_data_sql = 'select dist_id,sub_name from center_app.sub_category where main_id = 2 and flag in (1,0) and dist_id BETWEEN 2 and 25000 and del_info=1;' result = mysql_conn(sub_data_sql, **center_db_config) sub_data = list(result) insert_sub_sql = 'insert into game_server_price.dist_list value (%s,%s)' mysql_conn(insert_sub_sql, sub_data, **db_config) return dist_info_list def count_instance_price(): SQL_PRICES = ''' select c.name ,sum(b.price_base*a.size) as disk_price ,d.instances_price ,(sum(b.price_base*a.size)+ d.instances_price) as total ,c.instance_type ,e.trade_discount ,((sum(b.price_base*a.size)+ d.instances_price)*e.trade_discount) as last_price from game_server_price.disk_info a ,game_server_price.disk_price_info b ,game_server_price.trade_discount_base e ,game_server_price.instances_info c left join game_server_price.ecs_price_base d on c.instance_type=d.instance_type where a.disk_type = b.disk_type and a.company = b.company and a.date=date_sub(CURDATE(),interval 1 day) and c.date=date_sub(CURDATE(),interval 1 day) and c.id=a.server_id and a.company = e.company group by a.server_id ; ''' price_dict = {} result = mysql_conn(SQL_PRICES, **db_config) for i in result: name = str(i[0]).strip() price = str(i[6]) price_dict[name] = price return price_dict def count_all_dist_price(): sql = 'select a.name,a.app_name,b.company,b.instance_type,a.disk_size,a.dist_id ' \ 'from instances_center a,instances_info b ' \ 'where a.name=b.name and b.date=date_sub(CURDATE(),interval 1 day) ' \ 'and a.date=date_sub(CURDATE(),interval 1 day);' result = mysql_conn(sql, **db_config) all_price_dict = count_instance_price() all_instance_price = {} instance_price_list = [] error_list = [] for instance in result: name = str(instance[0]) price = all_price_dict[name] if price == "None": print("ERROR: %s price count failed!" % name) error_list.append(name) else: price = Decimal(price) if instance[1] == "adb_s": price = price / 2 instance_price_list.append([instance[5], instance[0], price]) try: all_instance_price[instance[5]][instance[0]] = price except: all_instance_price[instance[5]] = {} all_instance_price[instance[5]][instance[0]] = price if error_list: print "Error list:", str(error_list) sys.exit(1) mysql_conn("delete from game_server_price.instances_price_history where date=date_sub(CURRENT_DATE,interval 1 day);", **db_config) sql = 'insert into game_server_price.instances_price_history value (%s,%s,%s,date_sub(CURRENT_DATE,interval 1 day));' print instance_price_list mysql_conn(sql, instance_price_list, **db_config) all_dist_price = {} for dist in all_instance_price: all_dist_price[dist] = [] price = 0 for instance in all_instance_price[dist]: price = price + all_instance_price[dist][instance] all_dist_price[dist].append(price) return all_dist_price def get_dist_idc(): SQL_IDC = ''' select a.dist_id ,b.company from instances_center a ,instances_info b where a.app_name ='ccs' and a.name=b.name and a.date=b.date and a.date=date_sub(CURDATE(),interval 1 day); ''' idc_dict = {} result = mysql_conn(SQL_IDC, **db_config) for i in result: dist_id = i[0] idc = str(i[1]) idc_dict[dist_id] = idc return idc_dict def main(): get_servers() get_ucenter_info() count_all_dist_price() date = (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime("%Y-%m-%d") all_dist_price = count_all_dist_price() idc_dict = get_dist_idc() online_info = get_online_number() all_dist_price_per = [] for dist_id in all_dist_price: price = Decimal(all_dist_price[dist_id][0]) if dist_id not in idc_dict: continue idc = idc_dict[dist_id] try: online_num = Decimal(online_info[dist_id]) except: # 当新服部署后尚未开服时令人数为0 online_num = Decimal(0) if int(online_num) == 0: # 避免被除数为0 avg_price = price else: avg_price = Decimal(price / online_num).quantize(Decimal("0.000")) all_dist_price_per.append([dist_id, online_num, price, avg_price,idc, date]) date = (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime("%Y-%m-%d") delete_sql = 'delete from game_server_price.asktao_dist_price where date = "%s";' % date mysql_conn(delete_sql, **db_config) sql = 'insert into game_server_price.asktao_dist_price value (%s,%s,%s,%s,%s,%s);' mysql_conn(sql, all_dist_price_per, **db_config) if __name__ == '__main__': main() ---------------- from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.cvm.v20170312 import cvm_client, models from tencentcloud.cbs.v20170312 import cbs_client from tencentcloud.cbs.v20170312 import models as cbsmodels from aliyunsdkcore.client import AcsClient from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest from aliyunsdkecs.request.v20140526.DescribeDisksRequest import DescribeDisksRequest from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from openstack import exceptions from openstack import connection import requests import signer import json class cloud(object): def __init__(self): self.DISK_TYPE = { "SAS": "premium", "STAT": "basic", "SSD": "ssd", "CLOUD_BASIC": "basic", "CLOUD_PREMIUM": "premium", "CLOUD_SSD": "ssd", "ESSD_PL0": "ssd" } def get_instances_from_api(self): pass def get_disk_from_api(self): pass def get_instances(self): pass def get_disks(self): pass class alicloud(cloud): def get_instances_from_api(self, offset): zone_list = ['cn-beijing','cn-shanghai'] server_list = [] for zone_i in zone_list: try: client = AcsClient('LTAI4G696nAcjQUPayU7FVyA', 'Rl6O82hLn0cfssOZ8PdiTQJYmoqAtj', zone_i) request = DescribeInstancesRequest() request.set_accept_format('json') request.set_PageNumber(offset) request.set_PageSize(100) response = client.do_action_with_exception(request) info = json.loads(response)['Instances']['Instance'] for instance in info: name = instance['InstanceName'] ip = instance['VpcAttributes']['PrivateIpAddress']['IpAddress'][0] instance_type = instance['InstanceType'] id = instance['InstanceId'] server_list.append({"name": name, "ip": ip, "instance_type": instance_type, "company": "AliCloud", "id": id}) except Exception as err: print(err) return 0, server_list def get_instances(self): try: server_list = [] for offset in range(20): offset = offset + 1 flag, server_list_tmp = self.get_instances_from_api(offset) if flag: raise Exception("get tencent instances error") if server_list_tmp == []: break server_list = server_list + server_list_tmp return server_list except Exception as err: print(err) return 1, err def get_disk_from_api(self, offset): zone_list = ['cn-beijing','cn-shanghai'] disks_list = [] for zone_i in zone_list: try: client = AcsClient('LTAI4G696nAcjQUPayU7FVyA', '', zone_i) request = DescribeDisksRequest() request.set_accept_format('json') request.set_PageNumber(offset) request.set_PageSize(100) response = client.do_action_with_exception(request) info = json.loads(response)['Disks']['Disk'] for disk in info: server_id = disk['InstanceId'] disk_id = disk['DiskId'] disk_type = disk['Category'] dist_size = disk['Size'] disk_info = ['AliCloud', disk_id, server_id, disk_type, dist_size] disks_list.append(disk_info) except Exception as err: print(err) return 0, disks_list def get_disks(self): try: disks_list = [] for offset in range(20): offset = offset + 1 flag, disks_list_tmp = self.get_disk_from_api(offset) if flag: raise Exception("get tencent disks error") if disks_list_tmp == []: break disks_list = disks_list + disks_list_tmp return disks_list except Exception as err: print(err, 11) return 1, err def run_cloud(self): instences = self.get_instances() disks = self.get_disks() return {"instences": instences, "disks": disks} class tencent(cloud): def get_instances_from_api(self, offset): zone_list = ['ap-beijing','ap-shanghai'] server_list = [] for zone_i in zone_list: try: cred = credential.Credential("AKIDiV3GSXs7brvQhkqYlkV7XkmDV7g0A6ub", "") httpProfile = HttpProfile() httpProfile.endpoint = "cvm.tencentcloudapi.com" clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile client = cvm_client.CvmClient(cred, zone_i, clientProfile) req = models.DescribeInstancesRequest() params = {"Offset": offset, "Limit": 100} params = json.dumps(params) req.from_json_string(params) instance_result = client.DescribeInstances(req).to_json_string() instance_result = json.loads(instance_result) for instance in instance_result["InstanceSet"]: name = instance["InstanceName"] ip = instance["PrivateIpAddresses"][0] instance_type = instance["InstanceType"] id = instance["InstanceId"] status = instance["RestrictState"] print(instance) if status != "NORMAL":continue server_list.append({"name": name, "ip": ip, "instance_type": instance_type, "company": "Tencent", "id": id }) except Exception as err: print(err) return 0, server_list def get_instances(self): try: server_list = [] for offset in range(20): offset = offset * 100 flag, server_list_tmp = self.get_instances_from_api(offset) if flag: raise Exception("get tencent instances error") if server_list_tmp == []: break server_list = server_list + server_list_tmp return server_list except Exception as err: print(err) def get_disk_from_api(self, offset): disks_list = [] zone_list = ['ap-beijing','ap-shanghai'] for zone_i in zone_list: try: cred = credential.Credential("AKIDiV3GSXs7brvQhkqYlkV7XkmDV7g0A6ub", "") httpProfile = HttpProfile() httpProfile.endpoint = "cbs.tencentcloudapi.com" clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile client = cbs_client.CbsClient(cred, zone_i, clientProfile) req = cbsmodels.DescribeDisksRequest() params = {"Offset": offset, "Limit": 100} params = json.dumps(params) req.from_json_string(params) disks_result = client.DescribeDisks(req).to_json_string() disks_result = json.loads(disks_result) for disk in disks_result['DiskSet']: disk_id = disk['DiskId'] try: server_id = disk['InstanceIdList'][0] except: server_id = 'not-mount' disk_type = disk['DiskType'] dist_size = disk['DiskSize'] disk_info = ['Tencent', disk_id, server_id, disk_type, dist_size] disks_list.append(disk_info) except TencentCloudSDKException as err: print(err) return 0, disks_list def get_disks(self): try: disks_list = [] for offset in range(20): offset = offset * 100 flag, disks_list_tmp = self.get_disk_from_api(offset) if flag: raise Exception("get tencent instances error") if disks_list_tmp == []: break disks_list = disks_list + disks_list_tmp return disks_list except Exception as err: print(err) def run_cloud(self): instences = self.get_instances() disks = self.get_disks() return {"instences": instences, "disks": disks} class volcengine(cloud): def get_instances_from_api(self): try: server_list = [] import volcenginesdkcore import volcenginesdkecs from volcenginesdkcore.rest import ApiException configuration = volcenginesdkcore.Configuration() configuration.ak = "AKLTNzgyNTFhODhhMzIwNDM4YTlmNjA2ZTY4OTg4MGFhZTY" configuration.sk = "" configuration.region = "cn-beijing" api_instance = volcenginesdkecs.ECSApi(volcenginesdkcore.ApiClient(configuration)) page_number = 1 page_size = 100 total_count = None while True: describe_instances_request = volcenginesdkecs.DescribeInstancesRequest( page_number=page_number, page_size=page_size ) try: response = api_instance.describe_instances(describe_instances_request) if total_count is None: total_count = response.total_count for instance in response.instances: name = instance.instance_name ip = instance.network_interfaces[0].primary_ip_address if instance.network_interfaces else "" instance_type = instance.instance_type_id id = instance.instance_id server_list.append( {"name": name, "ip": ip, "instance_type": instance_type, "company": "Volcengine", "id": id}) if len(response.instances) < page_size or page_number * page_size >= total_count: break page_number += 1 except ApiException as e: print("Exception when calling ECS API: {}".format(e)) break return 0, server_list except Exception as err: print("Error in get_instances_from_api: {}".format(err)) return 1, err def get_disks_from_api(self): try: disk_list = [] import volcenginesdkcore import volcenginesdkstorageebs from volcenginesdkcore.rest import ApiException configuration = volcenginesdkcore.Configuration() configuration.ak = "AKLTNzgyNTFhODhhMzIwNDM4YTlmNjA2ZTY4OTg4MGFhZTY" configuration.sk = "" configuration.region = "cn-beijing" api_instance = volcenginesdkstorageebs.STORAGEEBSApi(volcenginesdkcore.ApiClient(configuration)) page_number = 1 page_size = 100 total_count = None while True: describe_volumes_request = volcenginesdkstorageebs.DescribeVolumesRequest( page_number=page_number, page_size=page_size ) try: response = api_instance.describe_volumes(describe_volumes_request) if total_count is None: total_count = response.total_count for volume in response.volumes: disk_id = volume.volume_id server_id = volume.instance_id if hasattr(volume, 'instance_id') and volume.instance_id else "not-mount" disk_type = volume.volume_type disk_size = volume.size disk_info = ['Volcengine', disk_id, server_id, disk_type, disk_size] disk_list.append(disk_info) if len(response.volumes) < page_size or page_number * page_size >= total_count: break page_number += 1 except ApiException as e: print("Exception when calling STORAGEEBS API: {}".format(e)) break print(f"Total disks fetched: {len(disk_list)}") return 0, disk_list except Exception as err: print(f"Error in get_disks_from_api: {err}") return 1, err def get_instances(self): try: flag, server_list = self.get_instances_from_api() if flag: raise Exception("get volcengine instances error") return server_list except Exception as err: print(err) return [] def get_disks(self): try: flag, disk_list = self.get_disks_from_api() if flag: raise Exception("get volcengine disks error") return disk_list except Exception as err: print(err) return [] def run_cloud(self): instances = self.get_instances() disks = self.get_disks() return {"instances": instances, "disks": disks} ---------------- 腾讯查询价格api--------- # -*- coding: utf-8 -*- import os import json import types from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.cvm.v20170312 import cvm_client, models try: # 密钥信息从环境变量读取,需要提前在环境变量中设置 TENCENTCLOUD_SECRET_ID 和 TENCENTCLOUD_SECRET_KEY # 使用环境变量方式可以避免密钥硬编码在代码中,提高安全性 # 生产环境建议使用更安全的密钥管理方案,如密钥管理系统(KMS)、容器密钥注入等 # 请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 cred = credential.Credential(os.getenv("TENCENTCLOUD_SECRET_ID"), os.getenv("TENCENTCLOUD_SECRET_KEY")) # 使用临时密钥示例 # cred = credential.Credential("SecretId", "SecretKey", "Token") # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = "cvm.tencentcloudapi.com" # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = cvm_client.CvmClient(cred, "ap-beijing", clientProfile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.InquiryPriceRunInstancesRequest() params = { "Placement": { "Zone": "ap-beijing-6" }, "ImageId": "img-p5nkhc2v", "InstanceChargeType": "PREPAID", "InstanceChargePrepaid": { "Period": 1 }, "InstanceType": "SA2.2XLARGE16" } req.from_json_string(json.dumps(params)) # 返回的resp是一个InquiryPriceRunInstancesResponse的实例,与请求对象对应 resp = client.InquiryPriceRunInstances(req) # 输出json格式的字符串回包 print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) ----腾讯api返回: { "Response": { "Price": { "BandwidthPrice": {}, "InstancePrice": { "Discount": 60, "DiscountPrice": 286.98, "OriginalPrice": 478.3 } }, "RequestId": "bd16e011-f83d-4bbc-bb2d-c31361508e11" } } ------------------------------------------------------------------------------------------------------------------------- 阿里查询价格api--------- # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. import os import sys from typing import List from alibabacloud_ecs20140526.client import Client as Ecs20140526Client from alibabacloud_credentials.client import Client as CredentialClient from alibabacloud_tea_openapi import models as open_api_models from alibabacloud_ecs20140526 import models as ecs_20140526_models from alibabacloud_tea_util import models as util_models from alibabacloud_tea_util.client import Client as UtilClient class Sample: def __init__(self): pass @staticmethod def create_client() -> Ecs20140526Client: """ 使用凭据初始化账号Client @return: Client @throws Exception """ # 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378659.html。 credential = CredentialClient() config = open_api_models.Config( credential=credential ) # Endpoint 请参考 https://api.aliyun.com/product/Ecs config.endpoint = f'ecs.cn-beijing.aliyuncs.com' return Ecs20140526Client(config) @staticmethod def main( args: List[str], ) -> None: client = Sample.create_client() describe_price_request = ecs_20140526_models.DescribePriceRequest( region_id='cn-beijing', instance_type='ecs.c5.xlarge', price_unit='Month', period=1 ) runtime = util_models.RuntimeOptions() try: # 制代码运行请自行打印 API 的返回值 client.describe_price_with_options(describe_price_request, runtime) except Exception as error: # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 # 错误 message print(error.message) # 诊断地址 print(error.data.get("Recommend")) UtilClient.assert_as_string(error.message) @staticmethod async def main_async( args: List[str], ) -> None: client = Sample.create_client() describe_price_request = ecs_20140526_models.DescribePriceRequest( region_id='cn-beijing', instance_type='ecs.c5.xlarge', price_unit='Month', period=1 ) runtime = util_models.RuntimeOptions() try: # 制代码运行请自行打印 API 的返回值 await client.describe_price_with_options_async(describe_price_request, runtime) except Exception as error: # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 # 错误 message print(error.message) # 诊断地址 print(error.data.get("Recommend")) UtilClient.assert_as_string(error.message) if __name__ == '__main__': Sample.main(sys.argv[1:]) --------阿里api返回: { "RequestId": "D1F58F14-AAF7-585D-B3A5-1523CC5D94A1", "PriceInfo": { "Price": { "OriginalPrice": 365, "ReservedInstanceHourPrice": 0, "DiscountPrice": 146, "Currency": "CNY", "DetailInfos": { "DetailInfo": [ { "OriginalPrice": 0, "DiscountPrice": 0, "Resource": "image", "TradePrice": 0 }, { "OriginalPrice": 358, "DiscountPrice": 143.2, "Resource": "instanceType", "TradePrice": 214.8 }, { "OriginalPrice": 7, "DiscountPrice": 2.8, "Resource": "systemDisk", "TradePrice": 4.2 }, { "OriginalPrice": 0, "DiscountPrice": 0, "Resource": "bandwidth", "TradePrice": 0 } ] }, "TradePrice": 219 }, "Rules": { "Rule": [ { "Description": "合同优惠_整单_6.0折", "RuleId": 2000019367043 } ] } } } ------------------------------------------------------------------------------------------------------------------ 火山云询价api # Example Code generated by Beijing Volcanoengine Technology. from __future__ import print_function import volcenginesdkcore import volcenginesdkbilling from volcenginesdkcore.rest import ApiException if __name__ == '__main__': # 注意示例代码安全,代码泄漏会导致AK/SK泄漏,有极大的安全风险。 configuration = volcenginesdkcore.Configuration() configuration.ak = "Your AK" configuration.sk = "Your SK" configuration.region = "cn-beijing" # set default configuration volcenginesdkcore.Configuration.set_default(configuration) # use global default configuration api_instance = volcenginesdkbilling.BILLINGApi() query_price_for_renew_request = volcenginesdkbilling.QueryPriceForRenewRequest( instance_id_list=["i-ye3aogjxfkwh2yrey86c"], product="ECS", use_duration=1, ) try: # 制代码运行示例,请自行打印API返回值。 api_instance.query_price_for_renew(query_price_for_renew_request) except ApiException as e: # 制代码运行示例,请自行打印API错误信息。 # print("Exception when calling api: %s\n" % e) pass --------火山云询价api调用返回结果 { "ResponseMetadata": { "RequestId": "20250924090622B58F540645656224EA78", "Action": "QueryPriceForRenew", "Version": "2022-01-01", "Service": "billing", "Region": "cn-beijing" }, "Result": { "Currency": "CNY", "TotalOriginalAmount": "561.17", "TotalDiscountAmount": "252.53", "InstanceAmountList": [ { "InstanceID": "i-ye3aogjxfkwh2yrey86c", "Product": "ECS", "ConfigurationCode": "ecs.c3a.2xlarge.month", "OriginalAmount": "561.17", "DiscountAmount": "252.53" } ], "CalSerialNo": "CSN_d39k83j65irjk3r3543g", "BaseResp": { "StatusMessage": "", "StatusCode": 0, "HTTPStatusCode": 0, "ErrorCode": "" } } }
最新发布
09-25
基础配置 使用IntelliJ IDEA打开项目文件夹,配置好SDK后IDEA会以maven项目打开并自动下载依赖包。 Spring属性文件路径:/src/main/resources/application.properties,其中可修改端口和mysql数据库地址 代码语言:javascript 代码运行次数:0 运行 AI代码解释 server.port=8089 ... spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_db?... 配置文件路径:/src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java,其中配置了图片路径 代码语言:javascript 代码运行次数:0 运行 AI代码解释 public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/upload/**").addResourceLocations("file:" + Constants.FILE_UPLOAD_DIC); registry.addResourceHandler("/goods-img/**").addResourceLocations("file:" + Constants.FILE_UPLOAD_DIC); } 此时是没有测试数据的,需要将/src/main/resources/upload.zip压缩包中的测试商品数据解压出来,放到任意的目录中。此处作为学习测试使用,可以直接解压在当前路径下,正式系统中一定要存放在非项目路径下。 在文件src/main/java/ltd/newbee/mall/common/Constants.java中,变量FILE_UPLOAD_DIC为当前上传图片路径,将其更改为我们解压upload.zip的绝对路径 代码语言:javascript 代码运行次数:0 运行 AI代码解释 public class Constants { //上传文件的默认url前缀,根据部署设置自行修改 public final static String FILE_UPLOAD_DIC = "/some_path/src/main/resources/upload/"; //public final static String FILE_UPLOAD_DIC = "D:\\upload\\";//上传文件的默认url前缀,根据部署设置自行修改 } 数据库配置 /src/main/resources 目录下有数据库文件 newbee_mall_schema.sql 。利用该文件创建数据库。 笔者的数据库是用直接docker pull下来的。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 docker cp ./newbee_mall_schema.sql container_id:/root (container_id为mysql容器名) 进入MYSQL容器创建数据库 代码语言:javascript 代码运行次数:0 运行 AI代码解释 root:/# mysql -u root -p mysql> create database newbee_mall_db; mysql> exit 执行sql文件 代码语言:javascript 代码运行次数:0 运行 AI代码解释 root:/# mysql -u root -p newbee_mall_db</root/newbee_mall_schema.sql 此时数据库成功配置完毕
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小Tomkk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值