天天看點

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

一、socketserver實作并發

基于tcp的套接字,關鍵就是兩個循環,一個連結循環,一個通信循環。

socketserver子產品中分兩大類:server類(解決連結問題)和request類(解決通信問題)

server類:

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

request類:

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

繼承關系:

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)
socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)
socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

以下述代碼為例,分析socketserver源碼:

ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)

ftpserver.serve_forever()

查找屬性的順序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer

執行個體化得到ftpserver,先找類ThreadingTCPServer的__init__,在TCPServer中找到,進而執行server_bind,server_active

找ftpserver下的serve_forever,在BaseServer中找到,進而執行self._handle_request_noblock(),該方法同樣是在BaseServer中

執行self._handle_request_noblock()進而執行request, client_address = self.get_request()(就是TCPServer中的self.socket.accept()),然後執行self.process_request(request, client_address)

在ThreadingMixIn中找到process_request,開啟多線程應對并發,進而執行process_request_thread,執行self.finish_request(request, client_address)

上述四部分完成了連結循環,本部分開始進入處理通訊部分,在BaseServer中找到finish_request,觸發我們自己定義的類的執行個體化,去找__init__方法,而我們自己定義的類沒有該方法,則去它的父類也就是BaseRequestHandler中找....

源碼分析總結:

基于tcp的socketserver我們自己定義的類中的

self.server即套接字對象

self.request即一個連結

self.client_address即用戶端位址

基于udp的socketserver我們自己定義的類中的

self.request是一個元組(第一個元素是用戶端發來的資料,第二部分是服務端的udp套接字對象),如(b'adsf', )

self.client_address即用戶端位址

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)
socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

importsocketserverimportstructimportjsonimportosclassFtpServer(socketserver.BaseRequestHandler):

coding='utf-8'server_dir='file_upload'max_packet_size=1024BASE_DIR=os.path.dirname(os.path.abspath(__file__))defhandle(self):print(self.request)whileTrue:

data=self.request.recv(4)

data_len=struct.unpack('i',data)[0]

head_json=self.request.recv(data_len).decode(self.coding)

head_dic=json.loads(head_json)#print(head_dic)

cmd=head_dic['cmd']ifhasattr(self,cmd):

func=getattr(self,cmd)

func(head_dic)defput(self,args):

file_path=os.path.normpath(os.path.join(

self.BASE_DIR,

self.server_dir,

args['filename']

))

filesize= args['filesize']

recv_size=0print('----->', file_path)

with open(file_path,'wb') as f:while recv_size

recv_data=self.request.recv(self.max_packet_size)

f.write(recv_data)

recv_size+=len(recv_data)print('recvsize:%s filesize:%s' %(recv_size, filesize))

ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)

ftpserver.serve_forever()

FtpServer

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)
socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

importsocketimportstructimportjsonimportosclassMYTCPClient:

address_family=socket.AF_INET

socket_type=socket.SOCK_STREAM

allow_reuse_address=False

max_packet_size= 8192coding='utf-8'request_queue_size= 5

def __init__(self, server_address, connect=True):

self.server_address=server_address

self.socket=socket.socket(self.address_family,

self.socket_type)ifconnect:try:

self.client_connect()except:

self.client_close()raise

defclient_connect(self):

self.socket.connect(self.server_address)defclient_close(self):

self.socket.close()defrun(self):whileTrue:

inp=input(">>:").strip()if not inp:continuel=inp.split()

cmd=l[0]ifhasattr(self,cmd):

func=getattr(self,cmd)

func(l)defput(self,args):

cmd=args[0]

filename=args[1]if notos.path.isfile(filename):print('file:%s is not exists' %filename)return

else:

filesize=os.path.getsize(filename)

head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}print(head_dic)

head_json=json.dumps(head_dic)

head_json_bytes=bytes(head_json,encoding=self.coding)

head_struct=struct.pack('i',len(head_json_bytes))

self.socket.send(head_struct)

self.socket.send(head_json_bytes)

send_size=0

with open(filename,'rb') as f:for line inf:

self.socket.send(line)

send_size+=len(line)print(send_size)else:print('upload successful')

client=MYTCPClient(('127.0.0.1',8080))

client.run()

FtpClient

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

二、資料庫簡介

1、資料庫

資料庫(database,DB)是指長期存儲在計算機内的,有組織,可共享的資料的集合。資料庫中的資料按一定的數學模型組織、描述和存儲,具有較小的備援,較高的資料獨立性和易擴充性,并可為各種使用者共享。

2、資料庫管理系統軟體

資料庫管理系統(Database Management System)是一種操縱和管理資料庫的大型軟體,用于建立、使用和維護資料庫,簡稱DBMS。它對資料庫進行統一的管理和控制,以保證資料庫的安全性和完整性。使用者通過DBMS通路資料庫中的資料,資料庫管理者也通過dbms進行資料庫的維護工作。它可使多個應用程式和使用者用不同的方法在同時或不同時刻去建立,修改和詢問資料庫。大部分DBMS提供資料定義語言DDL(Data Definition Language)和資料操作語言DML(Data Manipulation Language),供使用者定義資料庫的模式結構與權限限制,實作對資料的追加、删除等操作。

資料庫管理系統是資料庫系統的核心,是管理資料庫的軟體。資料庫管理系統就是實作把使用者意義下抽象的邏輯資料處理,轉換成為計算機中具體的實體資料處理的軟體。有了資料庫管理系統,使用者就可以在抽象意義下處理資料,而不必顧及這些資料在計算機中的布局和實體位置。

常見的資料庫管理軟體:甲骨文的oracle,IBM的db2,sql server, Access,Mysql(開源,免費,跨平台).

3、資料庫系統

資料庫系統DBS(Data Base System,簡稱DBS)通常由軟體、資料庫和資料管理者組成。其軟體主要包括作業系統、各種宿主語言、實用程式以及資料庫管理系統。資料庫由資料庫管理系統統一管理,資料的插入、修改和檢索均要通過資料庫管理系統進行。資料管理者負責建立、監控和維護整個資料庫,使資料能被任何有權使用的人有效使用。

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

三、MySQL

1、mysql的管理

安裝

linux:

--yum -y install mariadb mariadb-server

OR

--yum -y install mysql mysql-server

win:

--http://dev.mysql.com/downloads/mysql/

啟動

--service mysqld start #開啟

--chkconfig mysqld on #設定開機自啟

OR

--systemctl start mariadb

--systemctl enable mariadb

檢視

-- ps aux |grep mysqld #檢視程序

-- netstat -an |grep 3306 #檢視端口

設定密碼

-- mysqladmin -uroot password '123' #設定初始密碼,初始密碼為空是以-p選項沒有用

-- mysqladmin -u root -p123 password '1234' #修改root使用者密碼

登入

-- mysql #本地登入,預設使用者root,空密碼,使用者為[email protected]

-- mysql -uroot -p1234 #本地登入,指定使用者名和密碼,使用者為[email protected]

-- mysql -uroot -p1234 -h 192.168.31.95 #遠端登入,使用者為[email protected]

mysql的常用指令

-- --啟動mysql服務與停止mysql服務指令:-- --net start mysql--net stop mysql-- -- --登陸與退出指令:-- --mysql -h 伺服器IP -P 端口号 -u 使用者名 -p 密碼 --prompt 指令提示符 --delimiter 指定分隔符--mysql -h 127.0.0.1 -P 3306 -uroot -p123--quit------exit----\q;-- -- --\s; ------my.ini檔案:[mysql] default-character-set=gbk [mysqld] character-set-server=gbk-- --prompt 指令提示符(\D:目前日期 \d:目前資料庫 \u:目前使用者)-- --\T(開始日志) \t(結束日志)-- --show warnings;-- --help() ? \h-- --\G;-- --select now();--select version();--select user;-- --\c 取消指令-- --delimiter 指定分隔符

忘記密碼怎麼辦?

方法1:啟動mysql時,跳過授權表

[[email protected] ~]# service mysqld stop[[email protected] ~]# mysqld_safe --skip-grant-table &

[[email protected] ~]# mysql

mysql> select user,host,password from mysql.user;+----------+-----------------------+-------------------------------------------+

| user | host | password |

+----------+-----------------------+-------------------------------------------+

| root | localhost | *A4B6157319038724E3560894F7F932C8886EBFCF |

| root | localhost.localdomain | |

| root | 127.0.0.1 | |

| root | ::1 | |

| | localhost | |

| | localhost.localdomain | |

| root | % | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |

+----------+-----------------------+-------------------------------------------+

mysql> update mysql.user set password=password("123") where user="root" and host="localhost";

mysql> flush privileges;

mysql> exit

[[email protected] ~]# service mysqld restart[[email protected] ~]# mysql -uroot -p123

方法2(删庫):

删除與權限相關的庫mysql,所有的授權資訊都丢失,主要用于測試資料庫或者剛剛建庫不久沒有授權資料的情況(從删庫到跑路)[[email protected] ~]# rm -rf /var/lib/mysql/mysql[[email protected] ~]# service mysqld restart[[email protected] ~]# mysql

2、sql語句

sql是Structured Query Language(結構化查詢語言)的縮寫。SQL是專為資料庫而建立的操作指令集,是一種功能齊全的資料庫語言。

在使用它時,隻需要發出“做什麼”的指令,“怎麼做”是不用使用者考慮的。SQL功能強大、簡單易學、使用友善,已經成為了資料庫操作的基礎,并且現在幾乎所有的資料庫均支援sql。

2.1sql規範

<1> 在資料庫系統中,SQL語句不區分大小寫(建議用大寫) 。但字元串常量區分大小寫。建議指令大寫,表名庫名小寫;

<2> SQL語句可單行或多行書寫,以“;”結尾。關鍵詞不能跨多行或簡寫。

<3> 用空格和縮進來提高語句的可讀性。子句通常位于獨立行,便于編輯,提高可讀性。

SELECT * FROMtb_tableWHERE NAME="YUAN";

<4> 注釋:單行注釋:--

多行注釋:

<5>sql語句可以折行操作

<6> DDL,DML和DCL

socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)
socket怎麼讀取mysql資料庫_socketserver子產品、MySQL(資料庫、資料表的操作)

----SQL中 DML、DDL、DCL差別 .

---- DML(data manipulation language):--它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條指令是用來對資料庫裡的--資料進行操作的語言-- ---- DDL(data definition language):--DDL比DML要多,主要的指令有CREATE、ALTER、DROP等,DDL主要是用在定義或改變表(TABLE)--的結構,資料類型,表之間的連結和限制等初始化工作上,他們大多在建立表時使用-- ---- DCL(Data Control Language):--是資料庫控制功能。是用來設定或更改資料庫使用者或角色權限的語句,包括(grant,deny,revoke等)--語句。在預設狀态下,隻有sysadmin,dbcreator,db_owner或db_securityadmin等人員才有權--力執行DCL

View Code

2.2關于資料庫操作的sql語句

--1.建立資料庫(在磁盤上建立一個對應的檔案夾)

create database [if not exists] db_name [character set xxx]

--2.檢視資料庫

show databases;檢視所有資料庫

showcreate database db_name; 檢視資料庫的建立方式--3.修改資料庫

alter database db_name [character set xxx]

--4.删除資料庫

drop database [if exists] db_name;--5.使用資料庫

切換資料庫 use db_name; --注意:進入到某個資料庫後沒辦法再退回之前狀态,但可以通過use進行切換

檢視目前使用的資料庫 select database();

2.3資料表的增删改查

建立一張表

--文法

create tabletab_name(

field1 type[完整性限制條件],

field2 type,

...

fieldn type

)[character set xxx];

--建立一個員工表employee

create tableemployee(

idint primary keyauto_increment ,

namevarchar(20),

genderbit default 1, --gender char(1) default 1 ----- 或者 TINYINT(1)

birthday date,

jobvarchar(20),

salarydouble(4,2) unsigned,

resumetext --注意,這裡作為最後一個字段不加逗号

);

檢視表資訊

desctab_name 檢視表結構

show columnsfromtab_name 檢視表結構

show tables 檢視目前資料庫中的所有的表

showcreate table tab_name 檢視目前資料庫表建表語句

修改表結構

--(1)增加列(字段)

alter table tab_name add [column]列名 類型[完整性限制條件][first|after 字段名];alter table user add addr varchar(20) not null unique first/after username;

#添加多個字段alter tableusers2add addr varchar(20),add age intfirst,add birth varchar(20) after name;--(2)修改一列類型

alter table tab_name modify 列名 類型 [完整性限制條件][first|after 字段名];alter table users2 modify age tinyint default 20;alter table users2 modify age intafter id;--(3)修改列名

alter table tab_name change [column] 列名 新列名 類型 [完整性限制條件][first|after 字段名];alter table users2 change age Age int default 28first;--(4)删除一列

alter table tab_name drop [column]列名;--思考:删除多列呢?删一個填一個呢?

alter tableusers2add salary float(6,2) unsigned not nullafter name,dropaddr;--(5)修改表名

rename table 表名 to新表名;--(6)修該表所用的字元集

alter table student character set utf8;

删除表

drop table tab_name;