簡(jiǎn)介
- MySQL 是開(kāi)源的,分商業(yè)版和社區(qū)版。
- 關(guān)系型數(shù)據(jù)庫(kù)的一種,還有 SQLServer,SQLite,PostgreSQL,MariaDB,ORACLE...
- Linux作為操作系統(tǒng),Apache 或Nginx作為 Web 服務(wù)器,MySQL 作為數(shù)據(jù)庫(kù),PHP/Perl/Python作為服務(wù)器端腳本解釋器,這就是“LAMP“或“LNMP”組合。
安裝
windows:
下載軟件包,下一步。。。完成。
安裝可視化工具 MF (MySQL-Front)
linux:
- apt-get install mysql-server mysql-client
提示設(shè)置"root"密碼...
完成
命令行輸入: mysql -uroot -p
然后輸入:剛才設(shè)置的密碼
就可以用SQL語(yǔ)句操作數(shù)據(jù)庫(kù)了。
比如 : show databases - 修改配置文件:
cd /etc/mysql/
cd mysql.conf.d/
vi mysqld.cnf
...
service mysql restart
使用
- "--空格":代表注釋。
- ";": 分號(hào)代表一條語(yǔ)句的結(jié)束。
- 數(shù)據(jù)庫(kù)名, 表名,字段名,都有 反引號(hào) ``.
示例:通過(guò)MySQL-Front寫(xiě)的SQL語(yǔ)句

通過(guò) MySQLdb 操作數(shù)據(jù)庫(kù)
MySQLdb是一款較為底層的,python連接mysql用的模塊。和更加高級(jí)的,提供ORM的模塊不同,MySQLdb主要還是聚焦于如何和數(shù)據(jù)庫(kù)進(jìn)行連接和進(jìn)行基本的操作,操作的體現(xiàn)形式主要還是進(jìn)行SQL語(yǔ)句的執(zhí)行。
- 安裝 pipenv install mysqlclient
windows下失敗
去 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient (cp后面的數(shù)字,代表python版本)下載相應(yīng)版本的whl文件 如下圖
- pipenv install path/to/xx.whl
驗(yàn)證 :import MySQLdb這里還可以選擇其他的驅(qū)動(dòng)比如: cymysql
安裝:pipenv install cymysql
使用:
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+cymysql://root:123456@localhost/test"
- 建立連接
- 游標(biāo)對(duì)象執(zhí)行SQL語(yǔ)句,游標(biāo)對(duì)象返回?cái)?shù)據(jù)。
fetchone() , fetchall()返回的都是元組。
- 關(guān)閉連接
db.close()
- 例子:
查詢(xún)數(shù)據(jù)庫(kù)
封裝 fetchone() fetchall() 返回的結(jié)果
直接返回的是不帶 表字段 的元組,可讀性差。
增刪改查
都是通過(guò)cursor.execute(sql [,args])
然后再 con.commit() 提交.
con.rollback() 回滾 cursor 的所有操作。
通過(guò) SQLAlchemy 操作數(shù)據(jù)庫(kù)
http://docs.sqlalchemy.org/en/latest/orm/tutorial.html
安裝
-
pipenv install SQLAlchemy
檢測(cè)是否安裝成功
數(shù)據(jù)類(lèi)型
Integer Float Boolean ForeignKey Date/DateTime String...
建表
注意:
- 數(shù)據(jù)庫(kù) test 要提前建好。
- 設(shè)置編碼 utf8
engine = create_engine('mysql://root:123456@localhost/test?charset=utf8')
添加數(shù)據(jù),并提交到數(shù)據(jù)庫(kù)。
from sqlalchemy.orm import sessionmaker
.add_all ( [a, b] )
刪除數(shù)據(jù)
修改數(shù)據(jù)
可以多次 .add()
查找數(shù)據(jù)
- session.query(News).get(3)
get(),表示用主鍵查詢(xún)
從News表中,查詢(xún) id 是“3” 的數(shù)據(jù)
- session.query(News).filter_by(author="Lee")
從News表中,查詢(xún) 字段 是 "Lee" 的數(shù)據(jù)
- session.query(News).filter(News.author != "Lee")
從News表中,查詢(xún) 表名.字段 不是 "Lee" 的數(shù)據(jù)
- session.query(News.author.in_(["Lee", "Taylor"])
查詢(xún) 作者 是 Lee ,Taylor 的數(shù)據(jù)- session.query(~News.author.in_(["Lee", "Taylor"])
查詢(xún) 作者 不是 Lee , Taylor 的數(shù)據(jù)
- 邏輯 與 或
from sqlalchemy import and_, or_
session.query(News).filter(and_(條件1,條件2...))
session.query(News).filter(or_(條件1,條件2...))
模糊匹配 like
- session.query(News).filter(News.author.like('%張三%')
查詢(xún) 作者名,包含 "張三" 的數(shù)據(jù).
% 代表 0個(gè)或多個(gè)任意字符。- query().filter(News.author.like('_a_lor')
_ 代表 一個(gè)任意字符。
- .first() 和 .all()
- .one() 只查找一條數(shù)據(jù)
該方法在找到多條數(shù)據(jù),或者 找不到數(shù)據(jù),都會(huì)報(bào)錯(cuò).- .one_or_none() 找不到數(shù)據(jù)時(shí),返回None,找到多條也報(bào)錯(cuò)。
注意:query() 可以傳 表 或 表字段
排序
- .order_by(News.id.desc())
desc()降序
asc()升序
限制數(shù)量 和 計(jì)數(shù) 和 偏移
- .limit()
數(shù)量可以大于 實(shí)際返回的結(jié)果數(shù),不報(bào)錯(cuò)。- .count()
- .offset()
偏移從0開(kāi)始算.
通過(guò) session.execute() 執(zhí)行原生sql語(yǔ)句
r = session.execute("SELECT title, author, content FROM news where author='湯姆' ")
for i in r:
print(i.title, i.content)
通過(guò) Flask-SQLAlchemy 操作數(shù)據(jù)庫(kù)
http://www.pythondoc.com/flask-sqlalchemy/index.html
- 安裝
pipenv install flask-sqlalchemy連接數(shù)據(jù)庫(kù),建表,添加數(shù)據(jù)。
- 提示:
這里可以直接 from sqlalchemy import Column 和 數(shù)據(jù)類(lèi)型。
避免寫(xiě)成 db.Column 或 db.Integer...
- 增刪改查
格式 "表名.query.filter() / filter_by() / get()..."
同上面的 通過(guò) SQLAlchemy 操作數(shù)據(jù)庫(kù)
- get_or_404()
first_or_404()
在查找不到結(jié)果時(shí),返回一個(gè)404錯(cuò)誤,代替原來(lái)的get()和first()返回的None。注意,這里拋出了錯(cuò)誤,后續(xù)代碼不執(zhí)行。



















