0%

前言

帮老同学写的一个python脚本,具体需求主要是绘制一个面板,连接数据库,输入公司名称关键字,查询满足要求的数据,并且带有导出excel功能。数据库中的数据来源于https://blog.csdn.net/King__Cheung/article/details/109484246 这篇博客中通过python脚本调用企查查接口所获取到的数据。

一、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

# pip3 install PyMySQL

import tkinter as tk
from tkinter import messagebox
import pymysql
import csv
import os

window = tk.Tk()
# 标题
window.title('天眼查小工具')
# 窗口大小
window.geometry('900x500+500+250')
# 请输入关键字提示文字
label1 = tk.Label(window, text="请输入关键字:")
# 下方提示文字
label2 = tk.Label(window, text="输入关键字点击查询按钮即可搜索,点击导出数据即可导出为excel文件。")
# 关键字输入框
company_name_input = tk.Entry(window, show=None, font=('微软雅黑', 14))
# 查询结果显示文本框
text = tk.Text(window, width=71, height=14, font=('微软雅黑', 15))
# 滚动条
scroll = tk.Scrollbar()
# 连接数据库
db = pymysql.connect("localhost", "root", "zhangting", "holder")
cursor = db.cursor()
success_text = "程序启动成功。\n数据库连接成功。\n输入关键字开始查询吧..."
text.insert("insert", success_text)
export_res = ()
export_file_name = "data.csv"

# 清空
def reset():
global export_res
export_res = ()
company_name_input.delete(0, "end")
text.delete(1.0, "end")


# 查询
def search():
text.delete(1.0, "end")
key_word = company_name_input.get()
key_word = str(key_word).lstrip().rstrip()
get_data(key_word)


# 导出
def export():
if len(export_res) == 0:
messagebox.showwarning('提示', '内容为空,无法导出!')
return
create_csv_file('data-1')
csv_file = open(export_file_name, 'a+', newline='')
try:
writer = csv.writer(csv_file)
header = ('股东', '公司', 'Account UserName', 'Primary UserName', 'Account Segment', 'AM Name')
writer.writerow(header)
for res in export_res:
writer.writerow(res)
abspath = os.path.abspath(export_file_name)
messagebox.showinfo('提示', '文件导出完成!\n文件地址:' + abspath + "\n")
finally:
csv_file.close()


# 生成csv文件,且防止重名
def create_csv_file(file_name):
if os.path.exists(file_name + '.csv'):
index = int(file_name.split('-', 1)[1]) + 1
create_csv_file('data-' + str(index))
else:
global export_file_name
export_file_name = str(file_name) + '.csv'


# 查询按钮
button_search = tk.Button(window, text="查询", bg="LightBlue", font=('微软雅黑', 12), width=6, height=1, command=search)
# 清空按钮
button_reset = tk.Button(window, text="清空", bg="LightCyan", font=('微软雅黑', 12), width=6, height=1, command=reset)
# 导出按钮
button_export = tk.Button(window, text="导出数据", font=('微软雅黑', 12), width=8, height=1, command=export)


# 查询所有数据(包含直接关联与非直接关联的数据)
def execute_sql(key_word):
if len(key_word) != 0:
cursor.execute(
'select share,name,account_username,primary_username,account_segment'
',am_name from holder where share in (select share from holder where'
' name like \'%' + key_word + '%\')')
return cursor.fetchall()


# 查询直接关联的数据
def search_direct(key_word):
if len(key_word) != 0:
cursor.execute(
'select share,name,account_username,primary_username,account_segment'
',am_name from holder where name like \'%' + key_word + '%\'')
return cursor.fetchall()


# 查询数据、数据处理
def get_data(key_word):
content = '请输入关键字!'
if len(key_word) != 0:
result = execute_sql(key_word)
result = dig_data(result)
# 直接关联的数据
direct_result = search_direct(key_word)
# 求出非直接关联的公司
indirect_result = set(result).difference(set(direct_result))
indirect_result = tuple(indirect_result)
global export_res
export_res = result
if len(result) != 0:
content = "共查询到" + str(len(result)) + "条与“" + key_word + "”相关的信息:\n股东" \
+ " - " + "公司" + " - " + "Account UserName" \
+ " - " + "Primary UserName" + " - " + "Account Segment" \
+ " - " + "AM Name" + "\n"
content += "------------------------------\n与“" + key_word + "”直接关联的数据为:\n"
i = 1
for res in direct_result:
content += str(i) + "、" + res[0] + " - " + res[1] + " - " + res[2] \
+ " - " + res[3] + " - " + res[4] + " - " \
+ res[5] + "\n"
i += 1
content += "------------------------------\n与“" + key_word + "”非直接关联的数据为:\n"
if len(indirect_result) != 0:
for res in indirect_result:
content += str(i) + "、" + res[0] + " - " + res[1] + " - " + res[2] \
+ " - " + res[3] + " - " + res[4] + " - " \
+ res[5] + "\n"
i += 1
else:
content += "无数据\n"
else:
content = "未查询到任何与“" + key_word + "”相关的结果!"
text.insert("insert", content)
db.commit()


# 数据挖掘
def dig_data(result):
all_company = ""
for res in result:
all_company += res[1]
data = ()
for res in result:
share = str(res[0])
if share.endswith("公司"):
data += execute_sql(share)
return tuple(set(result + data))


# 控件布局
def main():
# "请输入关键字"提示文字坐标
label1.place(x=10, y=20)
# 关键字输入框坐标
company_name_input.place(x=100, y=17)
# 关键字输入框的长度与宽度
company_name_input.place(width=590, height=30)
# 查询按钮坐标
button_search.place(x=720, y=12)
# 清空按钮坐标
button_reset.place(x=800, y=12)
# 查询结果显示文本框坐标
text.place(x=12, y=60)
# 滚动条的位置
scroll.pack(side=tk.RIGHT, fill=tk.Y)
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
# 导出按钮坐标
button_export.place(x=780, y=455)
# 下方提示文字坐标
label2.place(x=10, y=465)
window.mainloop()


if __name__ == '__main__':
main()

阅读全文 »

Elasticsearch核心概念介绍

1、集群Cluster

一个或者多个安装了 es 节点的服务器组织在一起,就是集群,这些节点共同持有数据,共同提供搜索服务。

一个集群有一个名字,这个名字是集群的唯一标识,该名字成为 cluster name,默认的集群名称是 elasticsearch,具有相同名称的节点才会组成一个集群。

在集群中,节点的状态有三种:绿色、黄色、红色:

  • 绿色:节点运行状态为健康状态。所有的主分片、副本分片都可以正常工作。
  • 黄色:表示节点的运行状态为警告状态,所有的主分片目前都可以直接运行,但是至少有一个副本分片是不能正常工作的。
  • 红色:表示集群无法正常工作。
阅读全文 »

在日常工作天天都要使用到kubectl相关的命令,在此记录下一些常用的命令以及使用的技巧。

1、kubectl概述

 kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl本质上是通过命令行参数转换为对API Server的rest api 调用,并将结果输出。

2、资源对象类型

以下是kubectl支持的资源类型,以及他们的缩略别名:

阅读全文 »

R - 可执行状态

    只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。 Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态。 处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。

S - 可中断的睡眠状态

    处于这个状态的进程,因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态。CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU将会响应不过来。
阅读全文 »

基础概念

所有包都可以包含一个 init 函数。init 函数不应该有任何返回值类型和参数,在我们的代码中也不能显式地调用它。init 函数的形式如下:

1
2
3
func init(){

}

init 函数可用于执行初始化任务,也可用于在开始执行之前验证程序的正确性。

包的初始化顺序如下:

  1. 首先初始化包级别(Package Level)的变量
  2. 紧接着调用 init 函数。包可以有多个 init 函数(在一个文件或分布于多个文件中),它们按照编译器解析它们的顺序进行调用。

如果一个包导入了另一个包,会先初始化被导入的包。

尽管一个包可能会被导入多次,但是它只会被初始化一次。

阅读全文 »

介绍

pyinstaller 工具可以直接将python程序直接打包成可双击直接运行的文件

安装pyinstaller

1
pip install pyinstaller

使用

1
pyinstaller -F xxxx.py

进入dist/目录下,会发现生成了一个exe可执行文件,该文件可以直接在windows上双击运行。

阅读全文 »

前言:

分布式应该具备的条件:

  • 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
  • 高可用的获取锁与释放锁
  • 高性能的获取锁与释放锁
  • 具备可重入性
  • 具备锁失效机制,防止死锁
  • 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

分布式锁的三种实现方式:

  • 基于数据库
  • 基于缓存(Redis等)
  • 基于Zookeeper
阅读全文 »

原文地址:https://www.cnblogs.com/mayundalao/p/11798502.html

简述

分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。

例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。

解决方案

在分布式系统中,要实现分布式事务,无外乎那几种解决方案。

一、两阶段提交(2PC)

两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。

阅读全文 »