Python中操做mysql知識(一)

Python 標準數據庫接口爲 Python DB-API,Python DB-API爲開發人員提供了數據庫應用編程接口。html

Python 數據庫接口支持很是多的數據庫,你能夠選擇適合你項目的數據庫:python

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase

Python的DB-API,爲大多數的數據庫實現了接口,使用它鏈接各數據庫後,就能夠用相同 的方式操做各數據庫。mysql

Python DB-API使用流程:c++

1.    引入API模塊。
2.    獲取與數據庫的鏈接。
3.    執行SQL語句和存儲過程。
4.    關閉數據庫鏈接。
 sql

什麼是MySQLdb?


MySQLdb 是用於Python連接Mysql數據庫的接口,它實現了 Python 數據庫 API 規範 V2.0,基於 MySQL C API 上創建的。
如何安裝MySQLdb?
爲了用DB-API編寫MySQL腳本,必須確保已經安裝了MySQL。複製如下代碼,並執行:數據庫

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb


若是執行後的輸出結果以下所示,意味着你沒有安裝 MySQLdb 模塊:編程

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    import MySQLdb
ImportError: No module named MySQLdb


安裝MySQLdb,請訪問 http://sourceforge.net/projects/mysql-python ,(Linux平臺能夠訪問:https://pypi.python.org/pypi/MySQL-python)從這裏可選擇適合您的平臺的安裝包,分爲預編譯的二進制文件和源代碼安裝包。
若是您選擇二進制文件發行版本的話,安裝過程基本安裝提示便可完成。若是從源代碼進行安裝的話,則須要切換到MySQLdb發行版本的頂級目錄,並鍵入下列命令:windows

$ gunzip MySQL-python-1.2.2.tar.gz
$ tar -xvf MySQL-python-1.2.2.tar
$ cd MySQL-python-1.2.2
$ python setup.py build
$ python setup.py install

pip好像是不支持安裝MySQLdb的,咱們能夠經過網站下載安裝,
下載地址:https://pypi.python.org/pypi/MySQL-python/1.2.5
分別對應有windows和源碼安裝的方法bash

安裝依賴包:socket

yum install –y python-devel
yum install –y mysql-devel
yum install –y gcc

Python3之後好像是不支持MySQLdb了,能夠是用pymysql包,
能夠直接經過pymysql進行使用。

pip install pymysql

MySQLdb 只適用於python2.x,發現pip裝不上。它在py3的替代品是: import pymysql
 

Mysql的事務

通常來講,事務是必須知足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
一、事務的原子性:一組事務,要麼成功;要麼撤回。
二、穩定性 : 有非法數據(外鍵約束之類),事務撤回。
三、隔離性:事務獨立運行。一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回。事務的100%隔離,須要犧牲速度。
四、可靠性:軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定何時吧事務保存到日誌裏
 

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> show variables like 'auto%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
| autocommit               | ON    |
| automatic_sp_privileges  | ON    |
+--------------------------+-------+
4 rows in set (0.01 sec)

MariaDB [mysql]>


安裝Mysql

1.上官網,下源碼包

 

2.安裝依賴工具:

yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio libaio-devel perl-Data-Dumper net-tools

3. 解壓

rz

cd /usr/local/src

tar xzvf mysql-5.6.32.tar.gz

cd mysql-5.6.32

4.編譯:

cmake -DCMAKE_INSTALL_PREFIX=/export/servers/mysql/ -DMYSQL_DATADIR=/export/Data/mysql/data -DSYSCONFDIR=/export/servers/mysql/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_UNIX_ADDR=/export/Data/mysql/tmp/mysql.sock -DENABLED_LOCAL_INFILE=ON -DENABLED_PROFILING=ON -DWITH_DEBUG=0 -DMYSQL_TCP_PORT=3358

 

DCMAKE_INSTALL_PREFIX

/usr/local/mysql

安裝目錄

DMYSQL_DATADIR

/usr/local/mysql/data

數據庫位置

DSYSCONFDIR

/etc

配置文件位置

DWITH_MYISAM_STORAGE_ENGINE

1

安裝myisam存儲引擎

DWITH_INNOBASE_STORAGE_ENGINE

1

安裝innodb存儲引擎

DWITH_MEMORY_STORAGE_ENGINE

1

安裝memory存儲引擎

DWITH_READLINE

1

快捷鍵功能

DMYSQL_UNIX_ADDR

/var/lib/mysql/mysql.sock

Unix socket 文件路徑

DMYSQL_TCP_PORT

3306

MySQL監聽端口

DENABLED_LOCAL_INFILE

1

許從本地導入數據-

DWITH_PARTITION_STORAGE_ENGINE

1

安裝數據庫分區

DEXTRA_CHARSETS

all

安裝全部擴展字符集

DDEFAULT_CHARSET

utf8

使用utf8字符

DDEFAULT_COLLATION

utf8_general_ci

校驗字符

如圖所示編譯成功,每次進行echo $?進行驗證

make && make install

5.建立mysql用戶=並賦權

useradd mysql -s /sbin/nologin

chown -R mysql:mysql /export/servers/mysql /export/Data/mysql

6.初始化系統表:

cd /export/servers/mysql/scripts

./mysql_install_db --basedir=/export/servers/mysql/ --datadir=/export/Data/mysql/data --user=mysql

mkdir -p /export/servers/mysql/etc

cp /export/servers/mysql/my.cnf

yum remove -y mysql

7.啓動mysql

cd /export/servers/mysql

cp support-files/mysql.server /etc/init.d/mysqld

檢查配置文件的datadir,basedir等是否正確

service mysqld start

8.檢查mysql是否啓動成功

ps -ef |grep mysql

netstat -lnp |grep mysql

9.若是啓動不了,就在/export/Data/mysql/data找`hostname`.err對應的日誌查看

Mysql經常使用操做

•受權超級用戶:

•grant all privileges on *.* to 'fengxiaoqing'@'%' identified by 'admin@123' with grant option;

•查看庫:

•show databases;

•查看都有哪些庫  show databases;

•查看某個庫的表 use db; show tables \G;

•查看錶的字段 desc tb;

•查看建表語句 show create table tb;

•當前是哪一個用戶  select user();

•當前庫 select database();

•建立庫 create database db1;

•建立表 create table t1 (id int, name char(40) adress varchar(30)); 

•char(10)              'aaa       '

•varchar(10)          'aaa'

•查看數據庫版本 select version();

•查看mysql狀態 show status;

•修改mysql參數 show variables like 'max_connect%'; set global max_connect_errors = 1000;

•查看mysql隊列 show processlist;

•select * from information_schema.processlist where info is not null;

•sleep的能夠忽略,qurey查詢的纔有

•建立普通用戶並受權 grant all on *.* to databases1.user1 identified by '123456';

•grant all on db1.* to 'user2'@'10.0.2.100' identified by '111222';

•grant all on db1.* to 'user3'@'%' identified by '231222';insert into tb1 (id,name) values(1,'feng');

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

•查詢 select count(*) from mysql.user; select * from mysql.db; select * from mysql.db where host like '10.0.%';

•插入 update db1.t1 set name='aaa' where id=1; 

•清空表 truncate table db1.t1;

•刪除表 drop table db1.t1;

•刪除數據庫 drop database db1;

•修復表 repair table tb1 [use frm];

•查看權限show grants for root@'localhost';

•echo "select user,host,password from mysql.user" |mysql -uroot -p123456

•mysql -uroot -p1234556 -e "select user,host,password into outfile '/home/mysql/1.txt' from mysql.user;"

Mysql的鏈接

•1.建立數據庫 create database python;

•2. 受權用戶

•grant all privileges on *.* to feng@’%’ identified by ‘123456’;

•flush privilege;

•conn=MySQLdb.connect(host="192.168.100.101",user="feng",passwd="123456",db="python",charset="utf8")

 

比較經常使用的參數包括:

•host:數據庫主機名.默認是用本地主機

•user:數據庫登錄名.默認是當前用戶

•passwd:數據庫登錄的祕密.默認爲空

•db:要使用的數據庫名.沒有默認值

•port:MySQL服務使用的TCP端口.默認是3306,數字類型

•charset:數據庫編碼

 

推薦你們使用函數的方式:

def connect_mysql():
    db_config = {
        'host': '192.168.48.128',
        'port': 3306,
        'user': 'xiang',
        'passwd': '123456',
        'db': 'python',
        'charset': 'utf8'
    }
    cnx = MySQLdb.connect(**db_config)
return cnx

 

遊標

遊標(Cursor)是處理數據的一種方法,爲了查看或者處理結果集中的數據,遊標提供了在結果集中一次一行或者多行前進或向後瀏覽數據的能力。能夠把遊標看成一個指針,它能夠指定結果中的任何位置,而後容許用戶對指定位置的數據進行處理

Import…………
if __name__ == '__main__':
    cnx = connect_mysql()
    cus = cnx.cursor()
    sql  = ''' create table test(id int not null);insert into test(id) values (100);'''
    try:
        cus.execute(sql)
        cus.close()
        cnx.commit()
    except Exception as e:
        cnx.rollback()
        print('Error')
        # raise e
    finally:
        cnx.close()

遊標經常使用的方法:
經常使用方法:
cursor():建立遊標對象
Cus = connect_mysql().cursour()
close():關閉此遊標對象
excute(sql[, args]):執行一個數據庫查詢或命令
fetchone():獲得結果集的下一行
fetchmany([size = cursor.arraysize]):獲得結果集的下幾行
fetchall():獲得結果集中剩下的全部行
executemany (sql, args):執行多個數據庫查詢或命令

我的推薦,儘可能不使用executemany,經過程序循環不斷調用excute函數
 

數據庫鏈接池

import pymysql
from DBUtils.PooledDB import PooledDB

from DBUtils.PooledDB import PooledDB
db_config = {
        "host": "192.168.48.131",
        "port": 3306,
        "user": "xiang",
        "passwd": "xiang",
        "db": "python",
        # "charset": "utf8"
    }

spool = PooledDB(pymysql, 5, **db_config)  # 5爲鏈接池裏的最少鏈接數
# def connect_myssql():
conn = spool.connection()  # 之後每次須要數據庫鏈接就是用connection()函數獲取鏈接
cur = conn.cursor()
SQL = "select * from tmp;"
r = cur.execute(SQL)
r = cur.fetchall()
print(r)
cur.close()
conn.close()

 

 

參考文章:http://www.runoob.com/python/python-mysql.html

相關文章
相關標籤/搜索