id | name | age |
---|---|---|
1 | 羅輯 | 28 |
2 | 莊顏 | 25 |
3 | 葉文潔 | 54 |
4 | 程心 | 25 |
5 | 云天明 | 27 |
conn = MysqlConnection(string_arg="mysql -uroot -h127.0.0.1 -P3306 -p123456 -Dtest") result,count=conn.execute_sql("select * from test_table ") print(result) print(count) >>> ((1, '羅輯', '28'), (2, '莊顏', '25'), (3, '葉文潔', '54'), (4, '程心', '25'), (5, '云天明', '27')) >>> 5 #這里默認(rèn)是普通游標(biāo),你也可以指定使用字典游標(biāo): result, count = conn.execute_sql("select * from test_table ", cursor_type='dict') >>>[{'ID': 1, 'name': '羅輯', 'age': '28'}, {'ID': 2, 'name': '莊顏', 'age': '25'}, {'ID': 3, 'name': '葉文潔', 'age': '54'}, {'ID': 4, 'name': '程心', 'age': '25'}, {'ID': 5, 'name': '云天明', 'age': '27'}] >>>5
execute_sql 方法 返回的是一個(gè)元組,(結(jié)果集,條數(shù))
下文出現(xiàn)的所有方法無(wú)特殊說(shuō)明都是返回元組,且支持dict游標(biāo)
附帶參數(shù)執(zhí)行語(yǔ)句
這里的參數(shù)使用起來(lái)和 pymysql 提供的 execute 以及executemany 沒(méi)有任何 差別,以下簡(jiǎn)單提供幾個(gè)示例:
#傳元組 result,count=conn.execute_sql("select * from test_table where age=%s ",param=(25,)) #傳字典 result, count = conn.execute_sql("select * from test_table where age=%(age)s ", param={'age': 25}) #元組列表 result, count = conn.execute_sql("insert into test_table(`age`,`name`)values(%s,%s) ", param=[('宋運(yùn)輝', 37), ('程開(kāi)顏', 33)]) #字典列表 result, count = conn.execute_sql("insert into test_table(`age`,`name`)values(%(age)s,%(name)s) ", param=[ {"name":"宋運(yùn)輝",'age':37}, {"name":"程開(kāi)顏",'age':33} ])
select 方法 可以接受多參數(shù),參數(shù)列表如下。
def select(self, columns='id', table=None, where=None, group_by: str = None, order_by: str = None, limit: int = None, offset=None,cursor_type=None):
》》》 conn.select('*', 'test_table')
select id from test_table where age=25
》》》 conn.select('*', 'test_table', where={'age': 25})
select name,age from test_table where age=25 and id=2
多字段直接傳入字符串
》》》 conn.select("age,name", 'test_table', where={'age': 25,'id':2})
傳入列表/元組
》》》 conn.select(['age','name'], 'test_table', where={'age': 25,'id':2})
select * from test_table group by id order by age desc limit 1 offset 1
》》》conn.select('*', 'test_table', order_by='age desc',group_by='id',limit=1,offset=1)
select 功能看起來(lái)甚至不如直接寫(xiě)原生sql 快,但是如果查詢條件是在不斷變化的,尤其是where條件,那么使用select 方法 會(huì)比自行拼接更方便。
例如,需要不斷地讀取一個(gè)字典變量,然后根據(jù)這個(gè)變量中的條件去查詢數(shù)據(jù),而這個(gè)字典的鍵個(gè)數(shù)會(huì)變化,但是鍵都恰好是表的字段。這個(gè)時(shí)候使用select 方法會(huì)十分簡(jiǎn)便,只需要令where參數(shù)等于那個(gè)字典即可。
平心而論,這個(gè)方法確實(shí)用處不大。
def insert_into(self, table, data: dict or list, columns=None, ignroe=False, on_duplicate_key_update: str = None, return_id=False):
該方法可以接受傳入字典或者 字典列表,并且可選 返回 游標(biāo)影響的條數(shù) 或者是 新插入的數(shù)據(jù)的id。
columns 為空時(shí),將取第一條數(shù)據(jù)的所有鍵,此時(shí)請(qǐng)確保所有數(shù)據(jù)鍵相同。
#傳入 字典 data_1 = {"age": 44, 'name': "雷東寶"} count = conn.insert_into('test_table', data_1)#默認(rèn)返回受影響條數(shù) print(count) # >>> 1 return_id = conn.insert_into('test_table', data_1,return_id=True)# 可選返回id print(return_id) >>>22533 #傳入字典列表 data_2={"age": 22, 'name': "宋運(yùn)萍"} all_data=[data_1,data_2] count = conn.insert_into('test_table', all_data) #限定 插入的字段。(字典有多字段,但是只需要往表里插入指定的字段時(shí)) data_3= {"age": 44, 'name': "雷東寶","title":"村支書(shū)"} #title不需要,只要age和name count = conn.insert_into('test_table', data_1,columns=["age","name"] ) #ignore 參數(shù) data_1 = {"age": 44, 'name': "雷東寶","id":22539} count = conn.insert_into('test_table',ignore=True ) print(count) >>> 0 # 由于表中id 22539 已經(jīng)存在,該條記錄不會(huì)插入,影響 0條數(shù)據(jù) #on_duplicate_key_update 參數(shù) data_1 = {"age": 44, 'name': "雷東寶","id":22539} #id=22539 已經(jīng)存在 count = conn.insert_into('test_table', data_1,on_duplicate_key_update=' name="雷copy" ') print(count)#返回影響條數(shù) >>>2 #嘗試插入一條,但是發(fā)生重復(fù),于是刪除新數(shù)據(jù),并更新舊數(shù)據(jù)。實(shí)際上影響了兩條。
在insert_into 方法中提供了 on_duplicate_key_update 參數(shù),但是實(shí)際上使用起來(lái)比較雞肋,需要自己傳入 on_duplicate_key_update 后的語(yǔ)句進(jìn)行拼接。
如果你僅僅只是需要在發(fā)生重復(fù)時(shí)將舊數(shù)據(jù)的特定字段更新為新數(shù)據(jù)對(duì)應(yīng)字段的值時(shí)。merge_into 方法更適合。
在 其他關(guān)系型數(shù)據(jù)庫(kù)中,提供有merge into 的語(yǔ)法,但是mysql 中沒(méi)有提供。 不過(guò)這里我們通過(guò)insert 和 on_duplicate_key_update 語(yǔ)法 封裝出了一個(gè) 類(lèi)似merge_into 的方法。 該方法返回的是影響的條數(shù)
def* merge_into(self, table, data, columns=None, need_merge_columns: list = None):
columns 為空時(shí),將取第一條數(shù)據(jù)的所有鍵,此時(shí)請(qǐng)確保所有數(shù)據(jù)鍵相同。
need_merge_columns 為在發(fā)生重復(fù)時(shí)需要替換(覆蓋)的字段。
data_1 = {"age": 44, 'name': "雷東寶","id":22539} data_2={"age": 22, 'name': "宋運(yùn)萍","id":22540} all_data = [data_1, data_2,] count=conn.merge_into('test_table',all_data,need_merge_columns=['name',]) print(count) >>>4 #兩條數(shù)據(jù)正好都是重復(fù)的,插入兩條又刪除后修改兩條 ,返回4
該方法簡(jiǎn)單,不做過(guò)多說(shuō)明。該方法 返回的是影響的條數(shù)
def replace_into(self,table, data: dict or list, columns=None)
data_1 = {"age": 44, 'name': "雷東寶","id":22539} data_2={"age": 22, 'name': "宋運(yùn)萍","id":22540} all_data = [data_1, data_2,] count=conn.replace_into('test_table',all_data)
def update(self,table, data: dict, where, columns: None or list = None, limit=None):
該方法data 參數(shù)只接受傳入字典。該方法 返回的是影響的條數(shù)
data_1 = {"age": 44, 'name': "雷copy"} count=conn.update('test_table',data_1,where={'id':22539}) #更新 id=22539的數(shù)據(jù)為 新的data_1 print(count) >>>1
除此之外,還提供了一個(gè)衍生的方法
def update_by_primary(self, table, data: dict, pri_value, columns=None, primary: str = 'id'):
用于通過(guò)主鍵去更新數(shù)據(jù)。pri_value 即為主鍵的值。primary 為主鍵,默認(rèn)為id
data_1 = {"age": 44, 'name': "雷cpy"} count=conn.update_by_primary('test_table',data_1,pri_value=22539)
def delete_by_primary(self, table, pri_value, primary='id'): """ 通過(guò)主鍵刪除數(shù)據(jù) """ def delete(self,table, where: str or dict, limit: int = 0): """ 通過(guò)where條件刪除數(shù)據(jù) """ count=conn.delete('test_table',where={'name':'雷東寶'}) #刪除name=雷東寶的數(shù)據(jù) count=conn.delete_by_primary('test_table',pri_value=22539) #刪除主鍵等于22539 的數(shù)據(jù)
def do_transaction(self, sql_params: list, cursor_type=None):
sql_params 為 元組列表。 【(sql_1,param_1),(sql_2,param_2】
如果sql 不需要參數(shù)也要傳入 None ,如 【(sql_1,None),】
sql_params = [ ("update test_table set name=%(name)s where id=%(id)s ", {'name': '洛基', 'id': 22539}), ("update test_table set name=%(name)s where id=%(id)s ", {'name': 'mask', 'id': 22540}), ] count=conn.do_transaction(sql_params) >>>((), 1) #返回最后一條執(zhí)行語(yǔ)句的 結(jié)果和影響條數(shù)
def read_ss_result(self, sql, param=None, cursor_type='ss'):
cursor_type 可選 ss 和 ssdict
注意,該方法返回的是 生成器對(duì)象,拿到結(jié)果需要不斷進(jìn)行遍歷。
result=conn.read_ss_result("select * from test_table") for data in result: print(data)
以上就是python開(kāi)發(fā)一款操作MySQL的小工具的詳細(xì)內(nèi)容,更多關(guān)于python 操作MySQL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:鷹潭 惠州 常德 上海 益陽(yáng) 黑龍江 黔西 四川
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《用python開(kāi)發(fā)一款操作MySQL的小工具》,本文關(guān)鍵詞 用,python,開(kāi)發(fā),一款,操作,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。