小白初學(xué)mysql

謝謝程老師把我?guī)нM(jìn)mysql中,剛開(kāi)始學(xué)習(xí)python的時(shí)候,他就推薦需要學(xué)習(xí)數(shù)據(jù)庫(kù)。和他交流很多,比我小很多,但是儼然一個(gè)小老師。從新建一張表到插入數(shù)據(jù),邊做邊深掘一個(gè)一個(gè)知識(shí)點(diǎn)。也看了很多他分享的文章,很有自己的思想,而且非常詳細(xì)的在例子里備注很多知識(shí)點(diǎn)。

我寫簡(jiǎn)書的目的還是督促自己要記錄,可以經(jīng)?;仡櫍B(yǎng)成一個(gè)愛(ài)學(xué)習(xí)的好習(xí)慣。

主要知識(shí)點(diǎn)

一、mysql的基本操作(只是目前學(xué)到的知識(shí)打個(gè)卡哈,后邊還有許多操作需要自學(xué))
二、Scrapy中引入自建的Mysql類(直接拿老師的過(guò)來(lái)用)

第一部分

mysql 的基本操作:

工具
推薦數(shù)據(jù)庫(kù)管理工具:Navicat for mysql.
1)建立數(shù)據(jù)庫(kù)鏈接,
輸入連接名
主機(jī)名(本地機(jī)是localhost,或者ip地址是:127.0.0.1)
端口:3306
用戶名/密碼:很重要?。。。╯crapy中連接mysql的接口需要)

Paste_Image.png

請(qǐng)?jiān)徫也恢涝趺凑{(diào)整圖片大小
最后點(diǎn)下“連接測(cè)試”,測(cè)試成功,就可以看到一下界面

可以看到上邊的小海豚是你的連接名。
2)連接成功后,建立自己的mysql數(shù)據(jù)庫(kù)。

Paste_Image.png

注意默認(rèn)字符集是utf8#

Paste_Image.png

圖中的是local_db(這個(gè)也很重要)
我test的時(shí)候又新建了一個(gè)新的數(shù)據(jù)庫(kù)名字是“suzy”
3)現(xiàn)在可以開(kāi)始建表了
打mysql命令的地方在這里,點(diǎn)擊查詢,然后在空白處右鍵選擇“新建查詢”。

Paste_Image.png

命令如下:

use suzy;  # 先指定數(shù)據(jù)庫(kù)名‘suzy’
create table score(   # 新建表名是score
student_name varchar(100),  
#表中的字段名“student_name“,類型是varchar(100)
course varchar(100),
score int(11),
key name(student_name)
# key是索引,把字段名student_name作為索引
)engine=innodb default charset=utf8
#默認(rèn)的結(jié)尾

這樣一張表就建好了。但是目前沒(méi)有數(shù)據(jù)
4)插入數(shù)據(jù)到表名為suzy的表中。這樣表就是一張完整表了

insert into score values('liming','chinese',90);
#這里的values()的內(nèi)容的數(shù)據(jù)類型必須和建表的時(shí)候設(shè)置的數(shù)據(jù)類型一致

也可以寫成

insert into score (student_name,course,score)  #在score表的哪幾個(gè)字段插入數(shù)據(jù)
values   
('liming','chinese',90); #插入數(shù)據(jù)的值

然后執(zhí)行一下,數(shù)據(jù)就插進(jìn)去了
可以通過(guò)以下查詢語(yǔ)句看到表的結(jié)構(gòu)和數(shù)據(jù)
4)查詢表

select * from score   
# ‘*’表示score表的所有字段的數(shù)據(jù)都顯示
#如果要選擇某幾個(gè)字段,可以寫成 select course from score
Paste_Image.png

如果要指定查詢表的某幾條記錄,可以加入條件where

SELECT field1, field2,...fieldN FROM table_name
WHERE condition

5)左連接運(yùn)算---LEFT UNION(不好意思現(xiàn)在只學(xué)了左連接)
主體意思就是:有2張表,一張左表,一張右表吧,它兩有共同都字段集,也有不同都字段集。由于左表是老大,右表想要和他連結(jié),然后通過(guò)共同字段連結(jié)后,把右表有但是左表沒(méi)有的字段集貢獻(xiàn)給左表,左表就可以擴(kuò)張自己字段集(本身字段+右表貢獻(xiàn)都字段),這樣可以理解哇
廢話不說(shuō),舉栗子 :
創(chuàng)建新都一個(gè)表 ,假設(shè)以及插入數(shù)據(jù)如下:

score表.png
name_id表.png

第一個(gè)圖就是左表,left join的左表都是數(shù)據(jù)比較全都那種,第二個(gè)圖是右表,第一個(gè)張表的學(xué)生沒(méi)有id,現(xiàn)在把第二張表student_name對(duì)應(yīng)都
name_id給第一張表。需要寫如下sql命令:

select a.*,b.name_id
from score as a
left join name_id as b on b.student_name=a.student_name
order by b.name_id

注意查詢表都不是物理存在的表,所以我們可以對(duì)查詢表中引用的物理
表做一個(gè)另命名 ,score as a 表示把表score另命名為a表,所以查詢
表的字段為a.* 表示score表的所有字段。left join 的右邊就是你要被左
表連結(jié)的表。on為輔助條件,就是2表都有的共同字段,這里表示如果
有b表的學(xué)生名和a表的學(xué)生名一致,則把b表學(xué)生的id給到查詢表。

結(jié)果如下:

Paste_Image.png

該查詢表的主體還是左表score的所有記錄,只是添加了一個(gè)新的字段name_id,這個(gè)id的值是根據(jù)右表name_id的學(xué)生名對(duì)應(yīng)的id。

好,先介紹這么多,現(xiàn)在有了這幾個(gè)基礎(chǔ),就可以把之前scrapy版的爬蟲(chóng)進(jìn)行改造了。

第二部分

Scrapy中引入自定義的Mysql類

我之前做的scrapy都是存儲(chǔ)為csv,這次可以用程老師自己做的Mysql類來(lái)存儲(chǔ)數(shù)據(jù)到mysql數(shù)據(jù)庫(kù)中了。

class Mysql():
    #綁定3個(gè)參數(shù) 表名 字段列表 字段數(shù)量
    def __init__(self,table_name,field_list=[],field_num=0):
        self.table_name=table_name
        self.field_list=field_list
        self.field_num=field_num

    #建表函數(shù)
    def create_table(self):
        Field_list=[]
        for field in self.field_list:
            field+=' varchar(500)'
            Field_list.append(field)
        field_str=','.join(Field_list)

        engine='engine=innodb default charset=utf8'
        create_sql_str='create table IF NOT EXISTS %s(%s)%s' % (self.table_name,field_str,engine)
        print create_sql_str
        conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='local_db', port=3306,charset='utf8')
        with conn:
            cursor =conn.cursor()
            cursor.execute(create_sql_str)
    #插入數(shù)據(jù)函數(shù) 接收一個(gè)字典參數(shù)
    def insert(self,item={}):
        conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='local_db', port=3306,charset='utf8')
        #列表轉(zhuǎn)字符串  用于構(gòu)造insert_sql
        data=','.join(["'"+ item[i]+"'" for i in range(1,self.field_num+1)])
        with conn:
            cursor = conn.cursor()
            insert_sql='insert into %s values (%s) '% (self.table_name,data)
            print insert_sql
            cursor.execute(insert_sql)
            conn.commit()

先把這個(gè)類py文件放在scrapy的和pipelines.py同級(jí)的目錄下。
如下:

Paste_Image.png

好現(xiàn)在開(kāi)始介紹一下這個(gè)自建類 。類名:Mysql
def init(self,table_name,field_list=[],field_num=0):在初始話的時(shí)候 ,類就需要有3個(gè)形參“table_name”,“field_list”這個(gè)是列表,如果類實(shí)列化的時(shí)候 ,這個(gè)傳入的實(shí)參是空的,則這個(gè)默認(rèn)是空列表。field_num也一樣,默認(rèn)是0.
這個(gè)自建類的方法有2個(gè),一個(gè)是creat_table(self),一個(gè)是insert()方法。
先說(shuō)create_table方法。他主要是把field_list列表的字段插入 varchar(500)后然后強(qiáng)制字符串化。這個(gè)就是在組建mysql的create table命令
create_sql_str就是一句創(chuàng)建表的mysql語(yǔ)句。
另外:conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', db='local_db', port=3306,charset='utf8')這個(gè)就是打開(kāi)數(shù)據(jù)庫(kù)連接的關(guān)鍵語(yǔ)句。其中host='localhost'這是我們的連接名。user,passwd,db,port都是我們上邊創(chuàng)建數(shù)據(jù)庫(kù)的關(guān)鍵信息。如果寫錯(cuò)誤了,那么scrapy就不能和mysql數(shù)據(jù)庫(kù)對(duì)接。
with conn:表示打開(kāi)連接,數(shù)據(jù)傳輸完畢后關(guān)閉。
cursor 是數(shù)據(jù)庫(kù)游標(biāo),執(zhí)行之前的mysql命令,就想剛剛我們新建查詢中輸入mysql命令一樣。cursor.execute(create_sql_str)

另外一個(gè)insert()方法也是一樣的。
現(xiàn)在類已經(jīng)存在在scrapy中了,我們現(xiàn)在需要做的就是調(diào)用這個(gè)類,獎(jiǎng)數(shù)據(jù)存到mysql數(shù)據(jù)庫(kù)中。
scarpy框架中的數(shù)據(jù)存儲(chǔ)設(shè)置是放在pipeline.py中。

pipelines.py

from class_mysql import Mysql
field_list=['companyFullName','companySize','positionName','education','financeStage','salary','city','positionAdvantage']
field_num=len(field_list)
project=Mysql('lagoutest',field_list,field_num)
project.create_table()

class LagouPipeline(object):
    def process_item(self, item, spider):

        project.insert(item)

from class_mysql import Mysql就是我們從class_mysql.py引入Mysql這個(gè)類
field_list,field_num都是實(shí)參。
project=Mysql('lagoutest',field_list,field_num) project就是實(shí)列化這個(gè)Mysql類,把3個(gè)參數(shù)傳入其中?!甽agoutest'是類中數(shù)據(jù)庫(kù)的存儲(chǔ)數(shù)據(jù)的表名。field_list就是表的字段名。
然后在把pipelines.py的自帶類的方法process_item()中執(zhí)行mysql的insert插入數(shù)據(jù)語(yǔ)句。process_item()就是表示保存數(shù)據(jù)到文件中的作用。
project.insert(item)這里到item就是我們寫主爬蟲(chóng)的時(shí)候到yield item中的item。注意item是一個(gè)字典。我們?cè)跇?gòu)造Mysql類的時(shí)候方法insert(參數(shù))參數(shù)是一個(gè)字典。它的key=for i in range(1,field_num+1),所以在寫主爬蟲(chóng)的時(shí)候,yield item的item需要為item[1],item[2],item[3]......,如下

Paste_Image.png

我們看一下這個(gè)執(zhí)行的結(jié)果:

Paste_Image.png

可以看到local_db數(shù)據(jù)庫(kù)中多了一個(gè)新建的表lagoutest。

在看一下scrapy跑的時(shí)候,可以看到insert into table的mysql語(yǔ)句在執(zhí)行。


Paste_Image.png

總結(jié):

第一次用sql 開(kāi)心!獎(jiǎng)勵(lì)自己一個(gè)甜品!想減肥擼代碼!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪問(wèn),管理...
    chen_000閱讀 4,139評(píng)論 0 19
  • 一、爬取數(shù)據(jù) Python版本是3.6,爬取后保存在MySQL中,版本是5.5。 51job搜索位置的鏈接是【數(shù)據(jù)...
    木子人專臣巳水閱讀 4,375評(píng)論 0 1
  • 文|墨默 只有南方才有 特殊的天氣 北方是 一年四季都見(jiàn)不到的 氣溫升高的過(guò)程中 地面如下過(guò)雨般 就連 墻面也是會(huì)...
    墨默天地閱讀 468評(píng)論 2 19
  • 女性更需要關(guān)懷。 在當(dāng)今這個(gè)社會(huì)還是男性主導(dǎo)的社會(huì),會(huì)更多的傾向于男性,有更多的發(fā)言權(quán),女性是處于次要地位。 在夫...
    點(diǎn)心燈張權(quán)閱讀 536評(píng)論 0 1
  • 日精進(jìn)打卡第422,姓名:孫維潔 六項(xiàng)精進(jìn)第364期樂(lè)2學(xué)員,403期樂(lè)2志工,456期樂(lè)2志工,496服務(wù)和帶隊(duì)...
    孫維潔閱讀 276評(píng)論 0 0

友情鏈接更多精彩內(nèi)容