使用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.這樣的順序顯示。那該怎麼做 看圖 這是某專案的本地測試資料 查出所有的部門 很明顯,沒有序號,因為...