主頁 > 資料庫 > 【嘔心總結】python如何與mysql實作互動及常用sql陳述句

【嘔心總結】python如何與mysql實作互動及常用sql陳述句

2020-09-25 12:46:34 資料庫

9 月初,我對 python 爬蟲 燃起興趣,但爬取到的資料多通道實時同步讀寫用檔案并不方便,于是開始用起mysql,這篇筆記,我將整理近一個月的實戰中最常用到的 mysql 陳述句,同時也將涉及到如何在python3中與 mysql 實作資料交換,

關于工具/庫,特別說明下:

1、我安裝了 mysql ,并直接采用管理員身份運行命令列提示符(cmd)查看 mysql,并沒有安裝任何 mysql 的可視化圖形界面工具,

2、在 python 腳本中,我采用 pymysqlsqlalchemy 這兩個庫與 mysql 建立連接,用 pandas 來處理資料,

一、建立連接與資料互動

與 mysql 互動的方式,我目前共使用 4 種,其中采用管理員身份運行命令列提示符(cmd)查看 mysql,其操作圖示可另寫一篇,這里就不占篇幅了,mysql的可視化圖形界面工具,我目前并沒有用到,也沒有迫切使用它的需要,另外 3 種方式都是通過 python 腳本進行,

情境A:python 演算得出資料,想要寫入資料庫

python 腳本已得到表格類大量資料,想要一次性寫入資料庫,常用代碼如下:

import pandas as pd
# 與 mysql 建立連接
from sqlalchemy import create_engine
conn_eng = create_engine('mysql+pymysql://username:password@localhost:3306/databasename',encoding='utf8')  

# 呼叫 pandas 的方法,資料寫入mysql
pd.io.sql.to_sql(your_df, "table_name", conn_eng, if_exists='append',index=False)

表格類資料,我用的是 pandasdataframe 結構,pd.io.sql.to_sql() 的引數還有許多其它用途,但上面這種是我個人使用最高頻的,效果是:無需自己提前建表,將自動建新表,美中不足是:表的列屬性自動生成,通常不合心意,還需檢查和修改,

如果不想用 pd.io.sql.to_sql() 或者想更精細、復雜的操作,則用到下面的情境C,

情境B:python 腳本想從 mysql 拿到資料

如果已經存在某個表格,想要向該表格提交某條指令,需回傳資料,我用的是 pandasread_sql () ,回傳的資料型別是 pandasdataframe,sql 查詢陳述句挺好寫的,具體總結在本文下方,

import pymysql
# 與 mysql 建立連接
conn = pymysql.connect('localhost','username','password','databasename')
# sql 陳述句定義為一個字串
sql_search = 'select question_id from topic_monitor where is_title=0 ;'
# 呼叫 pandas 的 read_sql() 方法拿到 dataframe 結構的資料
question_ids = pd.read_sql(sql_search,conn)
# 關閉連接
conn.close()

情境C:python 腳本單方面向 mysql 發出指令,無需拿到資料

如果已經存在某個表格,想要向該表格提交某條指令而無需回傳資料時,比如:建表、對資料的增改刪、對列的名稱、列的屬性修改等,代碼如下,

import pymysql
# 與 mysql 建立連接
conn = pymysql.connect('localhost','username','password','databasename')
cursor = conn.cursor()
# sql 陳述句定義為一個字串,插入一行資料
sql_insert = 'INSERT INTO questions(q_id,q_title,q_description,q_keywords,q_people,q_pageview,time) VALUES( "'\
                + str(quesition_id) + '", "' + str(one[0])+ '", "' + str(one[1]) + '", "' + str(one[2]) + '", "' \
                + str(one[3]) + '", "' + str(one[4]) + '", "' + str(datetime.datetime.now()) + '");' 
# sql 陳述句定義為一個字串,修改某個資料(另一個表格)
sql_update = 'update topic_monitor SET is_title="1" where question_id = "' + str(quesition_id) + '";'
# 提交指令
cursor.execute(sql_insert)
cursor.execute(sql_update)
conn.commit()

# 插入一行資料;僅當該資料與表格已有資料不重復時才插入,否則就不會插入
sql_insert = 'INSERT INTO `topic_monitor`(question_id,is_title,q_type,topic_id,time) SELECT "'\
                    + x[0] + '", "0", "0","'  + str(topic_id) + '", "'+ str(now) + '" FROM DUAL WHERE NOT EXISTS(\
                    SELECT question_id FROM topic_monitor WHERE question_id = "' + x[0] + '")'
cursor.execute(sql_insert)
conn.commit()

# 關閉連接
cursor.close()
conn.close()

通過上面幾種實用情況可以看到,pythonmysql 實作互動的程序,通常分為:建立連接、把sql陳述句定義為字串,提交指令、關閉連接,核心的技能在于 sql陳述句;除了定義sql陳述句字串,其余3個處理都是固定的寫法,

我在最初一個月的實踐中,最常出現的錯誤有:

  • 值的參考沒有加上引號;
  • 符號錯亂:多一個符號,少一個符號;
  • 值的型別不符合:不管 mysql 表格中該值是數,還是文本,在定義 sql 陳述句的字串時,對每個值都需要轉化為字串;
  • 拷貝自己的代碼時,忘記修改databasename,

二、sql陳述句:搜索查詢

搜索是指在資料庫的某個表格中查詢符合特定條件的資料,并回傳查詢結果,其基本結構為:

SELECT 【范圍】FROM table_name 【條件】; 其中,范圍是必須指定的,而條件可有可無,

變數A:范圍,是指回傳查詢結果的范圍,

回傳該表格的所有欄位,用 * 表達:

SELECT * FROM table_name ;

image

僅回傳該表格的某個欄位:

SELECT column_name FROM table_name ;

僅回傳該表格的多個欄位:

SELECT column_name_1,column_name_3,column_name_3 FROM table_name ;

image

僅回傳符合條件的資料個數:

SELECT count(*) FROM table_name ;

image

變數B:條件是指,期望回傳的資料滿足哪些條件,

不限定條件:

SELECT * FROM table_name ;

數值類:某個欄位(數值型別的,比如double或者int),數值比較的運算子都可以使用比如,大于>,小于<,等于 = ,大于等于 >= ,小于等于 <=

image

SELECT * FROM table_name WHERE num_column_name >= 1;

文本類:某個欄位(字串型別的,比如char,text):

SELECT * FROM table_name WHERE str_column_name like “%your_str%”;

image

也可以表達多個條件,andor等可用于表達條件之間的關系:

SELECT * FROM table_name WHERE num_column_name_1 >= 1 and  str_column_name like “%your_str%” ;

image

三、sql陳述句:修改表屬性

橫向的一整條資料,叫做行;豎向的一整條資料,叫作列,列的名字,叫做 column,這是通用的知識點,

這段時間的實戰中,我完全沒有用到修改表的名稱、重設index等知識點,最常用的,就是對列進行操作,每個列具備:列的名稱、列的屬性、列的數值,

列的名稱,需要留心不使用保留詞,我的技巧是,盡量用一些_來表達該資料,比如 article_titlepress_date 這種命名雖然稍長,但易讀,也不會裝上保留詞,

列的屬性包括:型別,最大長度,是否為空,默認值,是否重復,是否為索引,通常,直接通過 pandaspd.io.sql.to_sql() 一次性創建表格并保存資料時,列的默認屬性并不合需求,要么提前自己定義表的結構,設定好每列屬性;要么事后檢查列屬性,并逐列修改,所以,列的屬性設定、修改是高頻基礎知識點,

列的數值,即除了列名稱外的、該列其它值,修改某個值,也是高頻操作,不過我把這個知識點放到第四部分了,

對列的名稱、列的屬性進行修改,主要的關鍵詞都是 ALTER,具體又分為以下幾種情況,

情境A:新增一列,關鍵詞 ADD

在你所指定的 column_name 后面定義列的屬性,

ALTER TABLE table_name ADD COLUMN column_name char(20);

情境B:修改某列的名稱,關鍵詞 CHANGE

在修改列名的同時也可以重新指定列的屬性,

ALTER TABLE table_name CHANGE old_column_name new_column_name char(50);

情境C:修改某列的屬性,關鍵詞是 MODIFY

ALTER TABLE table_name MODIFY column_name char(100);

四、sql陳述句:資料的增改刪

通常提到資料庫操作時,四字以蔽之:增刪改查,

  • 查詢,請看第二部分,關鍵詞是 SELECT
  • 對資料所依賴的屬性的增、改,請看第三部分,關鍵詞是 ALTER
  • 資料的增加,在第一部分的資料互動中也給出實體,就不重復了,關鍵詞是INSERT
  • 資料的修改,關鍵詞是 UPDATE
  • 資料(甚至表格、庫)的洗掉,關鍵詞是DELETE

資料的修改,副關鍵詞是 set

UPDATE table_name SET columns_name = new_value 【條件】;

新數值如果是數值型別的,則直接寫數值即可;如果是文本型別的,必須要加上雙引號,比如,“your_new_value”

如果把【條件】部分不寫,就相當于修改整列的值;想要修改特定范圍,就要用到條件運算式,這和前面的查詢部分是一致的,就不再重復,

資料的洗掉,對于新手來說,是必須警惕的操作,因為一旦誤操作,你將無力挽回,即便是職業程式員,也可能犯下無疑刪庫的慘劇,其基本陳述句為:

DELETE FROM table_name【條件】;

想要修改特定范圍,就要用到條件運算式,這和前面的查詢部分也是一致的,稍微啰嗦兩句:不要對自己設定的條件太自信,最好先用搜索陳述句檢查一下,然后再執行洗掉陳述句,

  • 洗掉單行資料:添加能唯一標識該行資料的條件陳述句,
  • 洗掉多行資料:添加能標識該范圍的條件陳述句,
  • 洗掉整張表格:你是認真的嗎?沒有寫錯表格名字吧?! 做這項操作前,必須確認清楚自己的意圖,畢竟一旦發生,無可挽回,

如果條件留空,將保留表結構,而洗掉所有資料行,想要洗掉整張表格,什么都不留下,則執行:

DELETE TABLE table_name;

俗稱的“刪庫”就是刪掉整個資料庫,雖然實戰中幾乎不會用到,但作為新手經常手誤,在練習階段安全起見,最好還是專門創建一個 database 用于練手,練完直接刪掉整個練習庫:

DELETE DATABASE database_name;

如果簡單總結下過去一個月,使用mysql的體驗,那就是:除了mysql 的安裝激活太麻煩,資料的增刪改查比操作文本方便太多了!!完全值得容忍安裝激活的麻煩,另外 mysql 常用語法確實簡單、非常有規律,

希望我的總結帶給你幫助,鼓勵我繼續分享,那就請點個贊吧!勘誤請留言,或挪步我的github:https://github.com/liujuanjuan1984/ucanuupnobb/issues

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/125644.html

標籤:MySQL

上一篇:MySQL問題記錄——ERROR 1728 (HY000)

下一篇:MySQL學習——操作存盤程序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more