简介
- MySQL 是开源的,分商业版和社区版。
- 关系型数据库的一种,还有 SQLServer,SQLite,PostgreSQL,MariaDB,ORACLE...
- Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器,这就是“LAMP“或“LNMP”组合。
安装
windows:
下载软件包,下一步。。。完成。
安装可视化工具 MF (MySQL-Front)
linux:
- apt-get install mysql-server mysql-client
提示设置"root"密码...
完成
命令行输入: mysql -uroot -p
然后输入:刚才设置的密码
就可以用SQL语句操作数据库了。
比如 : show databases - 修改配置文件:
cd /etc/mysql/
cd mysql.conf.d/
vi mysqld.cnf
...
service mysql restart
使用
- "--空格":代表注释。
- ";": 分号代表一条语句的结束。
- 数据库名, 表名,字段名,都有 反引号 ``.
示例:通过MySQL-Front写的SQL语句
通过 MySQLdb 操作数据库
MySQLdb是一款较为底层的,python连接mysql用的模块。和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式主要还是进行SQL语句的执行。
- 安装 pipenv install mysqlclient
windows下失败
去 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient (cp后面的数字,代表python版本)下载相应版本的whl文件 如下图
- pipenv install path/to/xx.whl
验证 :import MySQLdb这里还可以选择其他的驱动比如: cymysql
安装:pipenv install cymysql
使用:
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+cymysql://root:123456@localhost/test"
- 建立连接
- 游标对象执行SQL语句,游标对象返回数据。
fetchone() , fetchall()返回的都是元组。
- 关闭连接
db.close()
- 例子:
查询数据库
封装 fetchone() fetchall() 返回的结果
直接返回的是不带 表字段 的元组,可读性差。
增删改查
都是通过cursor.execute(sql [,args])
然后再 con.commit() 提交.
con.rollback() 回滚 cursor 的所有操作。
通过 SQLAlchemy 操作数据库
http://docs.sqlalchemy.org/en/latest/orm/tutorial.html
安装
-
pipenv install SQLAlchemy
检测是否安装成功
数据类型
Integer Float Boolean ForeignKey Date/DateTime String...
建表
注意:
- 数据库 test 要提前建好。
- 设置编码 utf8
engine = create_engine('mysql://root:123456@localhost/test?charset=utf8')
添加数据,并提交到数据库。
from sqlalchemy.orm import sessionmaker
.add_all ( [a, b] )
删除数据
修改数据
可以多次 .add()
查找数据
- session.query(News).get(3)
get(),表示用主键查询
从News表中,查询 id 是“3” 的数据
- session.query(News).filter_by(author="Lee")
从News表中,查询 字段 是 "Lee" 的数据
- session.query(News).filter(News.author != "Lee")
从News表中,查询 表名.字段 不是 "Lee" 的数据
- session.query(News.author.in_(["Lee", "Taylor"])
查询 作者 是 Lee ,Taylor 的数据- session.query(~News.author.in_(["Lee", "Taylor"])
查询 作者 不是 Lee , Taylor 的数据
- 逻辑 与 或
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('%张三%')
查询 作者名,包含 "张三" 的数据.
% 代表 0个或多个任意字符。- query().filter(News.author.like('_a_lor')
_ 代表 一个任意字符。
- .first() 和 .all()
- .one() 只查找一条数据
该方法在找到多条数据,或者 找不到数据,都会报错.- .one_or_none() 找不到数据时,返回None,找到多条也报错。
注意:query() 可以传 表 或 表字段
排序
- .order_by(News.id.desc())
desc()降序
asc()升序
限制数量 和 计数 和 偏移
- .limit()
数量可以大于 实际返回的结果数,不报错。- .count()
- .offset()
偏移从0开始算.
通过 session.execute() 执行原生sql语句
r = session.execute("SELECT title, author, content FROM news where author='汤姆' ")
for i in r:
print(i.title, i.content)
通过 Flask-SQLAlchemy 操作数据库
http://www.pythondoc.com/flask-sqlalchemy/index.html
- 安装
pipenv install flask-sqlalchemy连接数据库,建表,添加数据。
- 提示:
这里可以直接 from sqlalchemy import Column 和 数据类型。
避免写成 db.Column 或 db.Integer...
- 增删改查
格式 "表名.query.filter() / filter_by() / get()..."
同上面的 通过 SQLAlchemy 操作数据库
- get_or_404()
first_or_404()
在查找不到结果时,返回一个404错误,代替原来的get()和first()返回的None。注意,这里抛出了错误,后续代码不执行。