mysql數(shù)據(jù)庫(kù)(1)

2018-02-24 15:48 更新

盡管用文件形式將數(shù)據(jù)保存到磁盤(pán),已經(jīng)是一種不錯(cuò)的方式。但是,人們還是發(fā)明了更具有格式化特點(diǎn),并且寫(xiě)入和讀取更快速便捷的東西——數(shù)據(jù)庫(kù)(如果閱讀港臺(tái)的資料,它們稱(chēng)之為“資料庫(kù)”)。維基百科對(duì)數(shù)據(jù)庫(kù)有比較詳細(xì)的說(shuō)明:

數(shù)據(jù)庫(kù)指的是以一定方式儲(chǔ)存在一起、能為多個(gè)用戶(hù)共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合。

到目前為止,地球上有三種類(lèi)型的數(shù)據(jù):

  • 關(guān)系型數(shù)據(jù)庫(kù):MySQL、Microsoft Access、SQL Server、Oracle、...
  • 非關(guān)系型數(shù)據(jù)庫(kù):MongoDB、BigTable(Google)、...
  • 鍵值數(shù)據(jù)庫(kù):Apache Cassandra(Facebook)、LevelDB(Google) ...

在本教程中,我們主要介紹常用的開(kāi)源的數(shù)據(jù)庫(kù),其中MySQL是典型代表。

概況

MySQL是一個(gè)使用非常廣泛的數(shù)據(jù)庫(kù),很多網(wǎng)站都是用它。關(guān)于這個(gè)數(shù)據(jù)庫(kù)有很多傳說(shuō)。例如維基百科上這么說(shuō):

MySQL(官方發(fā)音為英語(yǔ)發(fā)音:/ma? ??skju???l/ "My S-Q-L",[1],但也經(jīng)常讀作英語(yǔ)發(fā)音:/ma? ?si?kw?l/ "My Sequel")原本是一個(gè)開(kāi)放源代碼的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),原開(kāi)發(fā)者為瑞典的MySQL AB公司,該公司于2008年被升陽(yáng)微系統(tǒng)(Sun Microsystems)收購(gòu)。2009年,甲骨文公司(Oracle)收購(gòu)升陽(yáng)微系統(tǒng)公司,MySQL成為Oracle旗下產(chǎn)品。

MySQL在過(guò)去由于性能高、成本低、可靠性好,已經(jīng)成為最流行的開(kāi)源數(shù)據(jù)庫(kù),因此被廣泛地應(yīng)用在Internet上的中小型網(wǎng)站中。隨著MySQL的不斷成熟,它也逐漸用于更多大規(guī)模網(wǎng)站和應(yīng)用,比如維基百科、Google和Facebook等網(wǎng)站。非常流行的開(kāi)源軟件組合LAMP中的“M”指的就是MySQL。

但被甲骨文公司收購(gòu)后,Oracle大幅調(diào)漲MySQL商業(yè)版的售價(jià),且甲骨文公司不再支持另一個(gè)自由軟件項(xiàng)目OpenSolaris的發(fā)展,因此導(dǎo)致自由軟件社區(qū)們對(duì)于Oracle是否還會(huì)持續(xù)支持MySQL社區(qū)版(MySQL之中唯一的免費(fèi)版本)有所隱憂(yōu),因此原先一些使用MySQL的開(kāi)源軟件逐漸轉(zhuǎn)向其它的數(shù)據(jù)庫(kù)。例如維基百科已于2013年正式宣布將從MySQL遷移到MariaDB數(shù)據(jù)庫(kù)。

不管怎么著,MySQL依然是一個(gè)不錯(cuò)的數(shù)據(jù)庫(kù)選擇,足夠支持讀者完成一個(gè)相當(dāng)不小的網(wǎng)站。

安裝

你的電腦或許不會(huì)天生就有MySQL(是不是有的操作系統(tǒng),在安裝的時(shí)候就內(nèi)置了呢?的確有,所以特別推薦Linux的某發(fā)行版),它本質(zhì)上也是一個(gè)程序,若有必要,須安裝。

我用ubuntu操作系統(tǒng)演示,因?yàn)槲蚁嘈抛x者將來(lái)在真正的工程項(xiàng)目中,多數(shù)情況下是要操作Linux系統(tǒng)的服務(wù)器,并且,我酷愛(ài)用ubuntu。還有,本教程的目標(biāo)是from beginner to master,不管是不是真的master,總要裝得像,Linux能夠給你撐門(mén)面。

第一步,在shell端運(yùn)行如下命令:

sudo apt-get install mysql-server

運(yùn)行完畢,就安裝好了這個(gè)數(shù)據(jù)庫(kù)。是不是很簡(jiǎn)單呢?當(dāng)然,當(dāng)然,還要進(jìn)行配置。

第二步,配置MySQL

安裝之后,運(yùn)行:

service mysqld start

啟動(dòng)mysql數(shù)據(jù)庫(kù)。然后進(jìn)行下面的操作,對(duì)其進(jìn)行配置。

默認(rèn)的MySQL安裝之后根用戶(hù)是沒(méi)有密碼的,注意,這里有一個(gè)名詞“根用戶(hù)”,其用戶(hù)名是:root。運(yùn)行:

$mysql -u root

在這里之所以用-u root是因?yàn)槲椰F(xiàn)在是一般用戶(hù)(firehare),如果不加-u root的話(huà),mysql會(huì)以為是firehare在登錄。

進(jìn)入mysql之后,會(huì)看到>符號(hào)開(kāi)頭,這就是mysql的命令操作界面了。

下面設(shè)置Mysql中的root用戶(hù)密碼了,否則,Mysql服務(wù)無(wú)安全可言了。

mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456";

用123456做為root用戶(hù)的密碼,應(yīng)該是非常愚蠢的,如果在真正的項(xiàng)目中,最好別這樣做,要用大小寫(xiě)字母與數(shù)字混合的密碼,且不少于8位。

以后如果在登錄數(shù)據(jù)庫(kù),就可以用剛才設(shè)置的密碼了。

運(yùn)行

安裝之后,就要運(yùn)行它,并操作這個(gè)數(shù)據(jù)庫(kù)。

$ mysql -u root -p
Enter password: 

輸入數(shù)據(jù)庫(kù)的密碼,之后出現(xiàn):

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 373
Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

看到這個(gè)界面內(nèi)容,就說(shuō)明你已經(jīng)進(jìn)入到數(shù)據(jù)里面了。接下來(lái)就可以對(duì)這個(gè)數(shù)據(jù)進(jìn)行操作。例如:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| carstore           |
| cutvideo           |
| itdiffer           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

用這個(gè)命令,就列出了當(dāng)前已經(jīng)有的數(shù)據(jù)庫(kù)。

對(duì)數(shù)據(jù)庫(kù)的操作,除了用命令之外,還可以使用一些可視化工具。比如phpmyadmin就是不錯(cuò)的。

更多數(shù)據(jù)庫(kù)操作的知識(shí),這里就不介紹了,讀者可以參考有關(guān)書(shū)籍。

MySQL數(shù)據(jù)庫(kù)已經(jīng)安裝好,但是Python還不能操作它,還要繼續(xù)安裝python操作數(shù)據(jù)庫(kù)的模塊——python-MySQLdb

安裝python-MySQLdb

python-MySQLdb是一個(gè)接口程序,python通過(guò)它對(duì)mysql數(shù)據(jù)實(shí)現(xiàn)各種操作。

在編程中,會(huì)遇到很多類(lèi)似的接口程序,通過(guò)接口程序?qū)α硗庖粋€(gè)對(duì)象進(jìn)行操作。接口程序就好比鑰匙,如果要開(kāi)鎖,人直接用手指去捅,肯定是不行的,那么必須借助工具,插入到鎖孔中,把鎖打開(kāi),之后,門(mén)開(kāi)了,就可以操作門(mén)里面的東西了。那么打開(kāi)鎖的工具就是接口程序。誰(shuí)都知道,用對(duì)應(yīng)的鑰匙開(kāi)鎖是最好的,如果用別的工具(比如錘子),或許不便利(其實(shí)還分人,也就是人開(kāi)鎖的水平,如果是江洋大盜或者小毛賊什么的,擅長(zhǎng)開(kāi)鎖,用別的工具也便利了),也就是接口程序不同,編碼水平不同,都是考慮因素。

啰嗦這么多,一言蔽之,python-MySQLdb就是打開(kāi)MySQL數(shù)據(jù)庫(kù)的鑰匙。

如果要源碼安裝,可以這里下載python-mysqldb:https://pypi.python.org/pypi/MySQL-python/

下載之后就可以安裝了。

ubuntu下可以這么做:

sudo apt-get install build-essential python-dev libmysqlclient-dev
sudo apt-get install python-MySQLdb

也可以用pip來(lái)安裝:

pip install mysql-python

安裝之后,在python交互模式下:

>>> import MySQLdb 

如果不報(bào)錯(cuò),恭喜你,已經(jīng)安裝好了。如果報(bào)錯(cuò),恭喜你,可以借著錯(cuò)誤信息提高自己的計(jì)算機(jī)水平了,請(qǐng)求助于google大神。

連接數(shù)據(jù)庫(kù)

要先找到老婆,才能談如何養(yǎng)育自己的孩子,同理連接數(shù)據(jù)庫(kù)之先要建立數(shù)據(jù)庫(kù)。

$ mysql -u root -p
Enter password:                             

進(jìn)入到數(shù)據(jù)庫(kù)操作界面:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 373
Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

輸入如下命令,建立一個(gè)數(shù)據(jù)庫(kù):

mysql> create database qiwsirtest character set utf8;
Query OK, 1 row affected (0.00 sec)

注意上面的指令,如果僅僅輸入:create database qiwsirtest,也可以,但是,我在后面增加了character set utf8,意思是所建立的數(shù)據(jù)庫(kù)qiwsirtest,編碼是utf-8的,這樣存入漢字就不是亂碼了。

看到那一行提示:Query OK, 1 row affected (0.00 sec),就說(shuō)明這個(gè)數(shù)據(jù)庫(kù)已經(jīng)建立好了,名字叫做:qiwsirtest

數(shù)據(jù)庫(kù)建立之后,就可以用python通過(guò)已經(jīng)安裝的mysqldb來(lái)連接這個(gè)名字叫做qiwsirtest的庫(kù)了。

>>> import MySQLdb
>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",port=3306,charset="utf8")

逐個(gè)解釋上述命令的含義:

  • host:等號(hào)的后面應(yīng)該填寫(xiě)mysql數(shù)據(jù)庫(kù)的地址,因?yàn)榫蛿?shù)據(jù)庫(kù)就在本機(jī)上(也稱(chēng)作本地),所以使用localhost,注意引號(hào)。如果在其它的服務(wù)器上,這里應(yīng)該填寫(xiě)ip地址。一般中小型的網(wǎng)站,數(shù)據(jù)庫(kù)和程序都是在同一臺(tái)服務(wù)器(計(jì)算機(jī))上,就使用localhost了。
  • user:登錄數(shù)據(jù)庫(kù)的用戶(hù)名,這里一般填寫(xiě)"root",還是要注意引號(hào)。當(dāng)然,如果讀者命名了別的用戶(hù)名,數(shù)據(jù)庫(kù)管理者提供了專(zhuān)有用戶(hù)名,就更改為相應(yīng)用戶(hù)。但是,不同用戶(hù)的權(quán)限可能不同,所以,在程序中,如果要操作數(shù)據(jù)庫(kù),還要注意所擁有的權(quán)限。在這里用root,就放心了,什么權(quán)限都有啦。不過(guò),這樣做,在大型系統(tǒng)中是應(yīng)該避免的。
  • passwd:上述user賬戶(hù)對(duì)應(yīng)的登錄mysql的密碼。我在上面的例子中用的密碼是"123123"。不要忘記引號(hào)。
  • db:就是剛剛通create命令建立的數(shù)據(jù)庫(kù),我建立的數(shù)據(jù)庫(kù)名字是"qiwsirtest",還是要注意引號(hào)??垂偃绻⒌臄?shù)據(jù)庫(kù)名字不是這個(gè),就寫(xiě)自己所建數(shù)據(jù)庫(kù)名字。
  • port:一般情況,mysql的默認(rèn)端口是3306,當(dāng)mysql被安裝到服務(wù)器之后,為了能夠允許網(wǎng)絡(luò)訪(fǎng)問(wèn),服務(wù)器(計(jì)算機(jī))要提供一個(gè)訪(fǎng)問(wèn)端口給它。
  • charset:這個(gè)設(shè)置,在很多教程中都不寫(xiě),結(jié)果在真正進(jìn)行數(shù)據(jù)存儲(chǔ)的時(shí)候,發(fā)現(xiàn)有亂碼。這里我將qiwsirtest這個(gè)數(shù)據(jù)庫(kù)的編碼設(shè)置為utf-8格式,這樣就允許存入漢字而無(wú)亂碼了。注意,在mysql設(shè)置中,utf-8寫(xiě)成utf8,沒(méi)有中間的橫線(xiàn)。但是在python文件開(kāi)頭和其它地方設(shè)置編碼格式的時(shí)候,要寫(xiě)成utf-8。切記!

注:connect中的host、user、passwd等可以不寫(xiě),只有在寫(xiě)的時(shí)候按照host、user、passwd、db(可以不寫(xiě))、port順序?qū)懢涂梢?,端口?hào)port=3306還是不要省略的為好,如果沒(méi)有db在port前面,直接寫(xiě)3306會(huì)報(bào)錯(cuò).

其實(shí),關(guān)于connect的參數(shù)還不少,下面摘抄來(lái)自mysqldb官方文檔的內(nèi)容,把所有的參數(shù)都列出來(lái),還有相關(guān)說(shuō)明,請(qǐng)看官認(rèn)真閱讀。不過(guò),上面幾個(gè)是常用的,其它的看情況使用。

connect(parameters...)

Constructor for creating a connection to the database. Returns a Connection Object. Parameters are the same as for the MySQL C API. In addition, there are a few additional keywords that correspond to what you would pass mysql_options() before connecting. Note that some parameters must be specified as keyword arguments! The default value for each parameter is NULL or zero, as appropriate. Consult the MySQL documentation for more details. The important parameters are:

  • host: name of host to connect to. Default: use the local host via a UNIX socket (where applicable)
  • user: user to authenticate as. Default: current effective user.
  • passwd: password to authenticate with. Default: no password.
  • db: database to use. Default: no default database.
  • port: TCP port of MySQL server. Default: standard port (3306).
  • unix_socket: location of UNIX socket. Default: use default location or TCP for remote hosts.
  • conv: type conversion dictionary. Default: a copy of MySQLdb.converters.conversions
  • compress: Enable protocol compression. Default: no compression.
  • connect_timeout: Abort if connect is not completed within given number of seconds. Default: no timeout (?)
  • named_pipe: Use a named pipe (Windows). Default: don't.
  • init_command: Initial command to issue to server upon connection. Default: Nothing.
  • read_default_file: MySQL configuration file to read; see the MySQL documentation for mysql_options().
  • read_default_group: Default group to read; see the MySQL documentation for mysql_options().
  • cursorclass: cursor class that cursor() uses, unless overridden. Default: MySQLdb.cursors.Cursor. This must be a keyword parameter.
  • use_unicode: If True, CHAR and VARCHAR and TEXT columns are returned as Unicode strings, using the configured character set. It is best to set the default encoding in the server configuration, or client configuration (read with read_default_file). If you change the character set after connecting (MySQL-4.1 and later), you'll need to put the correct character set name in connection.charset.

If False, text-like columns are returned as normal strings, but you can always write Unicode strings.

This must be a keyword parameter.

  • charset: If present, the connection character set will be changed to this character set, if they are not equal. Support for changing the character set requires MySQL-4.1 and later server; if the server is too old, UnsupportedError will be raised. This option implies use_unicode=True, but you can override this with use_unicode=False, though you probably shouldn't.

If not present, the default character set is used.

This must be a keyword parameter.

  • sql_mode: If present, the session SQL mode will be set to the given string. For more information on sql_mode, see the MySQL documentation. Only available for 4.1 and newer servers.

If not present, the session SQL mode will be unchanged.

This must be a keyword parameter.

  • ssl: This parameter takes a dictionary or mapping, where the keys are parameter names used by the mysql_ssl_set MySQL C API call. If this is set, it initiates an SSL connection to the server; if there is no SSL support in the client, an exception is raised. This must be a keyword parameter.

已經(jīng)完成了數(shù)據(jù)庫(kù)的連接。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)