Python基礎——數據庫MySQL(0508)

1、Python 對數據庫的支持python

一、Python的  DB-API 爲大多數數據庫提供了接口。mysql

二、使用流程爲:①引入API模塊②獲取與數據庫的鏈接③執行SQL語句和存儲過程④關閉數據庫鏈接。sql

三、Python2 與 Python3 在於數據庫鏈接時使用的包不同。其中 Python2 使用的是MySQLdb;而Python3 使用的是pymysql。數據庫

四、Python 2 安裝MySQL是經過MySQLdb接口。編程

    下載地址https://pypi.python.org/pypi/MySQL-python/1.2.5   分別對應Windows 和源碼安裝。網絡

五、Python 3 安裝MySQL數據庫pymsql包:(Python 3 客戶端)ide

     5.1 輸入import pymysql   而後鼠標單擊pymysql  而後同時按Alt+enter   會自動進行安裝。函數

     5.2 在 pycharm 軟件上點擊 Terminal 輸入命令  pip install pymysql  便可安裝此包。性能

     二、fetch

2、mysql 的事物:

     事務是必須知足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)。

    ①原子性:一組事務,要麼成功;要麼撤回。例如一次處理200個事物,有一個失敗,就會撤回該任務。

    ②穩定性 : 有非法數據(外鍵約束之類),事務撤回。

    ③隔離性:事務獨立運行。一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回。

                   事務的100%隔離,須要犧牲速度

    ④可靠性:軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。

       可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit選項決定何時把事務保存到日誌裏。

3、常見的MySQL操做命令

一、Linux命令下進入MySQL:    

     [root@JSH-01 ~]# mysql -uroot -p123456      輸入帳戶密碼鏈接本機

     [root@JSH-01 ~]# mysql -uroot -p123456 -h127.0.0.1 -p3306  輸入帳戶密碼IP及端口鏈接遠程機器

二、受權用戶  &  受權超級用戶

     grant all privileges on *.* to 'username'@'%' identified by ''password' ;

     其中privileges - 用戶的操做權限      grant all privileges   授予全部權限    

           *.*  全部的庫全部的表               %表明通配全部IP地址                    password 表明密碼

          用以上命令受權的用戶不能給其它用戶受權,若是想讓該用戶能夠受權,增長 with grant option

     即 grant all privileges on *.* to 'username'@'%' identified by ''password' with grant option;

三、進入MySQL後,經常使用的命令(注意使用 ; 由於分號是命令的結尾)

mysql> show  databases;     查看庫

mysql> use ID;    切換庫(ID指的是庫名,例如  name   student  等)

mysql> create database db1;   建立庫db1

mysql> show tables;    查看庫裏的表

mysql> show status;    查看MySQL狀態(通常主從同步的時候用的多)

mysql> create  table student(列名1 數據類型,列名2 數據類型……);    建立student表,類型爲列名1…

mysql> select version();    查看當前數據庫版本

mysql> select user();    查看當前用戶

mysql> truncate table    清空表

mysql> drop table  刪除表

mysql> drop database  刪除數據庫

mysql> select * from ID;    查找庫名爲ID 中的 關鍵字*

四、mysql> show variables like '%auto%';      自動提交(將事物結果自動提交)

五、更改密碼 UPDATE mysql.user SET password=PASSWORD("newpwd") WHERE user='username' ;    

4、 經過Python 鏈接 MySQL

一、Python 3 安裝MySQL數據庫pymsql包。詳見如上介紹。

二、在MySQL上進行受權

      grant all privileges on *.* to 'username'@'%' identified by ''password' with grant option;

三、在pycharm 中經過命令導入pymysql模塊鏈接 MySQL  

import pymysql
conn = pymysql.connect(host="192.168.6.137",port =3306,user="root",passwd="123456",db="test")  #建立鏈接
print(conn)

也能夠直觀的定義(使用函數)

def connect_mysql():
    db_config={
        "host":"192.168.6.137",     #定義host
        "port":3306,
        "user":"root",
        "passwd":"123456",
        "db":"python"
        "charset":"utf8"
    }
    con = pymysql.connect(db_config)
    retun con
if __name__ == '__main__':
    con=connect_mysql()

經常使用的參數包括:host  數據庫主機 IP       user 數據庫登陸名     passwd  數據庫登陸密碼

                         db 要使用的數據庫名      port 數據庫的TCP端口,默認是3306

                         charset  數據庫編碼,通常是utf8   (該編碼 通常不寫)

四、常見的錯誤信息

4.1 在鏈接mysql數據庫的時候,會報錯形成沒法鏈接成功數據庫。

     例如:Can't connect to MySQL server on '192.168.6.137' (timed out)"

     解決:(以 MySQL 安裝在 Cent OS 7 爲例)

              首先肯定鏈接mysql時候的 帳戶和密碼  是否正確。

              其次檢查輸入的 IP 是否正確。使用 ifconfig 查看。

              再次確認MySQL宿主機的網絡與pycharm所在電腦的網絡是否連通。

              而後查看MySQL的3306端口是否打開。必要時重啓MySQL服務:/etc/init.d/mysqld restart

              再次關閉防火牆 firewall 即:

                    systemctl stop firewalld.service         #中止運行firewalld服務
                    systemctl disable firewalld.service     #關閉 firewalld服務
                    systemctl mask firewalld.service        #屏蔽該服務,使其不能啓動

              中止運行 iptables 防火牆,或   清空其規則   iptables -F

      此時鏈接正常:

5、遊標

      遊標是處理數據的一種方法,爲了查看或者處理結果集中的數據。

      能夠把遊標看成一個指針,它能夠指定結果中的任何位置,而後容許用戶對指定位置的數據進行處理

一、建立遊標    cursor()

conn = pymysql.connect(host="192.168.6.137", port=3306, user='root', passwd='123456', db="test")
cus = conn.cursor()    #定義遊標

二、遊標的經常使用操做

# 取全部的結果,取結果以前,必定要先執行sql     即 cus.execute(sql)
# cus.fetchall()
# 取一個結果
# cus.fetchone()
# 取10行數據
# cus.fetchmany(size=10)
# 關閉遊標
# cus.close()

6、MySQL 鏈接池:PooledDB

      在python編程中可使用pymysql進行數據庫的鏈接/查詢/插入/更新等操做,可是每次鏈接mysql數據庫請求時,都是獨立的去請求訪問,至關浪費資源,並且訪問數量達到必定數量時,對mysql的性能會產生較大的影響。所以,實際使用中,一般會使用數據庫的鏈接池技術,來訪問數據庫達到資源複用的目的。

       數據庫鏈接池負責分配、管理和釋放數據庫鏈接。它容許應用程序重複使用一個現有的數據庫鏈接,而不是再從新創建一個。

       

示例:

import pymysql
from DBUtils.PooledDB import PooledDB
db_config = {
    "host":"192.168.6.137",
    "port":3306,
    "user":"root",
    "passwd":"123456",
    "db":"mysql",
    "charset":"utf8"
}
sql ="select * from mysql.proc limit 10; "
pool = PooledDB(pymysql,5,**db_config)  #5爲最小鏈接數
conn = pool.connection()
cus = conn.cursor()    #建立遊標

try:
    cus.execuute(sql)
    result = cus.fetchall()
    print(result)
    cus.close()
    conn.commit()
except:
    conn.rollback()
finally:
    conn.close()

7、建立表格

一、設計表結構

二、經過以下代碼在MySQL 的 stg庫中建立 Course、Score、Student、Teacher、tmp1表。

import pymysql
def connectMysql():
  db_config = {
      "host":"192.168.6.137",
      "port":3306,
      "user":"root",
      "passwd":"123456",
      "db":"stg"
}
  conn = pymysql.connect(**db_config)
  return conn

student =  '''
    create table Student(
      stdid INT PRIMARY KEY,
      stdname varchar(100),
      gender enum('F','M'),
      age INT      
    )
'''
course = '''
    create table Course(
      couid int not null,
      cname varchar(50) not null,
      tid int not null
    )
'''
score = '''
    create table Score(
      sid int not null,
      stdid int not null,
      couid int not null,
      grade int not null
    )
'''
teacher = '''
    create table Teacher(
      tid int not null,
      tname varchar(50) not null     
    )
'''
tmp1 = '''set @i := 0;'''
tmp = '''create table tmp1 as select (@i :=@i +1) as id from information_schema.tables limit 10;'''
if __name__ == '__main__':
    conn = connectMysql()
    cur = conn.cursor()
    try:
        cur.execute(student)
        cur.execute(course)
        cur.execute(score)
        cur.execute(teacher)
        cur.execute(tmp1)
        cur.execute(tmp)
        cur.close()
        conn.commit()
    except:
        conn.rollback()
        print("error")
        raise
    finally:
        conn.close()

結果以下:

8、增長數據

9、查詢和刪除數據

10、改數據和索引

相關文章
相關標籤/搜索