如何給Python的MySQL模組加功能

2021-06-22 22:18:15 字數 4025 閱讀 2471

使用python操作mysql

資料庫的時候常使用mysqldb這個模組。

今天在開發的過程發現mysqldb.connect有些引數沒法設定。通過這個頁面我們可以看到在connect的時候,可以設定的option和client_flags和mysql c api相比差不少。

乙個很重要的引數 mysql_opt_read_timeout沒法設定,這個引數如果不設定,極致狀況mysql處於hang住,自動切換ip漂移,客戶端無法重連到新mysql。

給mysqldb加option很簡單,只要修改_mysql.c這個把python物件對映到mysql操作的檔案,新增引數,再加一段mysql_option即可。

下面是修改後的git diff 檔案

diff --git a/_mysql.c b/_mysql.c  

index d42cc54..61a9b34

100644

--- a/_mysql.c  

+++ b/_mysql.c  

@@ -489,9

+489,10

@@ _mysql_connectionobject_initialize(  

"named_pipe"

, "init_command"

,  "read_default_file"

, "read_default_group"

,  "client_flag"

, "ssl"

,  -                                 "local_infile"

,  +                                 "local_infile"

, "read_timeout"

,  null } ;  

int connect_timeout = 0

;  +       int read_timeout = 0

;  int compress = -1

, named_pipe = -

1, local_infile = -

1;  

char *init_command=null,  

*read_default_file=null,  

@@ -500,7

+501,7

@@ _mysql_connectionobject_initialize(  

self

->converter = null;  

self

->open = 

0;  

check_server_init(-1

);  

-       if

(!pyarg_parsetupleandkeywords(args, kwargs, 

"|ssssisoiiisssioi:connect"

,  +       if

(!pyarg_parsetupleandkeywords(args, kwargs, 

"|ssssisoiiisssioii:connect"

,  kwlist,  

&host, &user, &passwd, &db,  

&port, &unix_socket, &conv,  

@@ -509,7

+510,8

@@ _mysql_connectionobject_initialize(  

&init_command, &read_default_file,  

&read_default_group,  

&client_flag, &ssl,  

-                                        &local_infile /* do not patch for reconnect, idiots  

+                                        &local_infile, &read_timeout  

+                                        /* do not patch for reconnect, idiots  

if you do this, i will not support your packages. */  

))  

return-1

;  @@ -540,6

+542,12

@@ _mysql_connectionobject_initialize(  

mysql_options(&(self

->connection), mysql_opt_connect_timeout,  

(char *)&timeout);  

}  +  

+        if

(read_timeout)   

+  if

(compress != -

1) {  

mysql_options(&(self

->connection), mysql_opt_compress, 

0);  

client_flag |= client_compress;

hoterran@hoterran-laptop:~/projects/mysql-python-

1.2.

3$ git diff setup_posix.py 

diff --git a/setup_posix.py b/setup_posix.py 

index 86432f5

..f4f08f1 

100644

--- a/setup_posix.py 

+++ b/setup_posix.py 

@@ -23,7

+23,7

@@ def

mysql_config(what): 

ifret/

256> 1: 

raise

environmenterror(

"%s not found"

% (mysql_config.path,)) 

return

data 

-mysql_config.path = "mysql_config"

+mysql_config.path = "/usr/local/mysql/bin/mysql_config"

defget_config(): 

import

os, sys

編譯通過,我們來試試新增的read_timeout這個引數。

conn = mysqldb.connect(host = db_server,user = db_username,passwd = db_password,db = db_name, port=int(db_port), client_flag = 

2, read_timeout = 10)

然後執行語句前,你試著把mysql用gdb hang住10s後,python就會異常拋錯

operationalerror: (

2013

, 'lost connection to mysql server during query'

) >/home/hoterran/projects/dbaas/trunk/dbtest.py(18

)() 

>mydb.execute_sql(conn, sql) 

(pdb) 

--return-- 

> /home/hoterran/projects/dbaas/trunk/dbtest.py(18

)()->

none

> mydb.execute_sql(conn, sql) 

(pdb) 

operationalerror: (2013

, 'lost connection to mysql server during query'

) > (1

)()->

none

如何給Python的MySQL模組加功能

使用python操作mysql 資料庫的時候常使用mysqldb這個模組。今天在開發的過程發現mysqldb.connect有些引數沒法設定。通過這個頁面我們可以看到在connect的時候,可以設定的option和client flags和mysql c api相比差不少。乙個很重要的引數 mysq...

python如何給字典排序

在python裡,字典dictionary是內建的資料型別,是個無序的儲存結構,每一元素是key value對 如 dict 其中 username 和 password 是key,而 xiaoming 和 123456 是value,可以通過d key 獲得對應值value的引用,但是不能通過va...

mysql 如何給查詢的資料新增序號

通常我們使用sql 查詢的資料都是通過某個字段 去排序或者降序,但有的時候我們若需要這個序號的時候,怎麼辦,比如我取某乙個時間段內的資料,我們可以讓他以某種規則排序,但實際上我們想要他 按 0,1,2.這樣的順序顯示。那該怎麼做 看圖 這是某專案的本地測試資料 查出所有的部門 很明顯,沒有序號,因為...