设为首页 收藏本站
查看: 567|回复: 0

[经验分享] Python 操作 MySQL数据库

[复制链接]

尚未签到

发表于 2018-8-7 09:11:11 | 显示全部楼层 |阅读模式
一、安装 MySQL
  可以直接从MySQL官方网站下载最新版本。MySQL是跨平台的,选择对应的平台下载安装文件,安装即可。 如果是Windows用户,那么安装过程非常简单,直接根据向导一步一步操作即可。 如果是 Linux 用户,安装过程也是相当简单的。
## Ubuntu / Debian  
$ sudo apt-get install mysql-server
  
$ sudo apt-get install mysql-client
  

  
## CentOS / RHEL
  
# yum install -y mysql mysql-server mysql-devel
  基础设置:
## 启动 mysql  
# service mysqld start
  

  
## 初始化
  
# /usr/bin/mysql_secure_installation
  

  
## 编辑 my.cnf ,修改默认编码设置
  
# vi /etc/my.cnf
  
[client]
  
default-character-set = utf8
  

  
[mysqld]
  
default-storage-engine = INNODB
  
character-set-server = utf8
  
collation-server = utf8_general_ci
  

  
## 验证
  
# service mysqld restart
  
# mysql -u root -p
  

  
mysql> show variables like '%char%';
  
+--------------------------+----------------------------+
  
| Variable_name            | Value                      |
  
+--------------------------+----------------------------+
  
| character_set_client     | utf8                       |
  
| character_set_connection | utf8                       |
  
| character_set_database   | utf8                       |
  
| character_set_filesystem | binary                     |
  
| character_set_results    | utf8                       |
  
| character_set_server     | utf8                       |
  
| character_set_system     | utf8                       |
  
| character_sets_dir       | /usr/share/mysql/charsets/ |
  
+--------------------------+----------------------------+
  
8 rows in set (0.00 sec)
二、安装 MySQL 驱动
  由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器。
  目前,有两个MySQL驱动:

  •   mysql-connector-python:是MySQL官方的纯Python驱动;
  •   MySQL-python:是封装了MySQL C驱动的Python驱动。
  MySQL-python

  MySQL-3.23 through 5.5 and Python-2.4 through 2.7 are currently supported. Python-3.0 will be supported in a future>  方式一:(推荐)
# pip install MySQL-python  方式二:(推荐)
## Ubuntu  
$ sudo apt-get install python-mysqldb
  

  
## CentOS
  
# yum install -y MySQL-python
  方式三:
  下载地址: https://pypi.python.org/pypi/MySQL-python/
  下载完成MySQL-python-1.2.5.zip 文件之后直接解压。进入MySQL-python-1.2.5目录:
# unzip MySQL-python-1.2.5.zip  
# cd MySQL-python-1.2.5
  
# python setup.py install
  
  测试是否安装成功
  测试非常简单,检查 MySQLdb 模块是否可以正常导入即可。
[root@localhost ~]# python  
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
  
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
  
Type "help", "copyright", "credits" or "license" for more information.
  
>>> import MySQLdb
  没有报错提示MySQLdb模块找不到,说明安装OK 。
三、数据库基本操作回顾
mysql> show databases;                 // 查看当前所有的数据库  
+--------------------+
  
| Database           |
  
+--------------------+
  
| information_schema |
  
| mysql              |
  
+--------------------+
  
2 rows in set (0.15 sec)
  

  
mysql> CREATE DATABASE test;            // 创建数据库
  
Query OK, 1 row affected (0.17 sec)
  

  
mysql> use test;
  
Database changed
  
mysql> show tables;                     // 查看数据库表
  
Empty set (0.00 sec)
  

  
// 创建名为 user 的表
  
mysql> CREATE TABLE user
  
(
  
    id INT UNSIGNED AUTO_INCREMENT,
  
    name VARCHAR(20),
  
    password VARCHAR(20),
  
    PRIMARY KEY(id)
  
) engine=innodb default
  
Query OK, 0 rows affected (0.16 sec)
  

  
// 向表中插入几条数据
  
mysql> INSERT INTO user(name, password) VALUES('Tom', '1321'),('Alen', '7875'),('Jack', '6759');
  
Query OK, 3 rows affected (0.07 sec)
  
Records: 3  Duplicates: 0  Warnings: 0
  

  
// 查看 user 表数据
  
mysql> SELECT * FROM user;
  
+----+------+----------+
  
| id | name | password |
  
+----+------+----------+
  
|  1 | Tom  | 1321     |
  
|  2 | Alen | 7875     |
  
|  3 | Jack | 6759     |
  
+----+------+----------+
  
3 rows in set (0.13 sec)
四、Python 操作数据库
  先来个简单的示例程序:
# -*- coding: utf-8 -*-  

  
import MySQLdb
  

  
try:
  
    conn = MySQLdb.connect(
  
        host = 'localhost',
  
        user = 'root',
  
        passwd = '123456',
  
        db = 'test',
  
        port = 3306
  
        )
  
    cur = conn.cursor()
  

  
    # 执行SQL
  
    cur.execute ("""
  
    CREATE TABLE python
  
    (
  
        ID INT,
  
        COL1 VARCHAR(40),
  
        COL2 VARCHAR(40),
  
        COL3 VARCHAR(40)
  
    )
  
    """)
  

  
    cur.execute ("""
  
    INSERT INTO TEST (ID, COL1, COL2, COL3)
  
    VALUES
  
        (1, 'a', 'b', 'c'),
  
        (2, 'aa', 'bb', 'cc'),
  
        (3, 'aaa', 'bbb', 'ccc')
  
    """)
  

  
    cur.execute('select * from python')
  

  
    cur.close()
  
    conn.commit()
  
    conn.close()
  
except MySQLdb.Error,e:
  
     print "Mysql Error %d: %s" % (e.args[0], e.args[1])
  请注意修改你的数据库,主机名,用户名,密码。 连接数据库时要注意数据库编码,不然一堆编码问题很愁人的~最好统一使用utf8编码。为了避免乱码,可修改一个参数:
  conn = MySQLdb.Connect(host='localhost', user='root', passwd='123456', db='test') 中加一个属性:
  改为:
  conn = MySQLdb.Connect(host='localhost', user='root', passwd='123456', db='test', charset='utf8')
  charset是要跟你数据库的编码一样,如果是数据库是gb2312 ,则写charset='gb2312'。
  1、增
  
# -*- coding: utf-8 -*-  

  
import MySQLdb
  

  
conn = MySQLdb.connect(
  host = 'localhost',
  port = 3306,
  user = 'root',
  passwd = '123456',
  db = 'test',
  charset = 'utf8'
  
)
  

  
cur = conn.cursor()
  

  
cur.execute("INSERT INTO user(name, password) VALUES('python', '8901')")
  

  
cur.close()
  
conn.commit()
  
conn.close()
  通过上面execute()方法中写入纯的sql语句来插入数据并不方便。如:
  >>> cur.execute("insert into user(name, password)  values('python', '8901')")
  我要想插入新的数据,必须要对这条语句中的值做修改。我们可以做如下修改:
# -*- coding: utf-8 -*-  

  
import MySQLdb
  

  
conn = MySQLdb.connect(
  host = 'localhost',
  port = 3306,
  user = 'root',
  passwd = '123456',
  db = 'test',
  charset = 'utf8'
  
)
  

  
cur = conn.cursor()
  

  
sqli = "INSERT INTO user(name, password) VALUES(%s, %s)"
  
cur.execute(sqli, ('chrome', '1903'))
  

  
cur.close()
  
conn.commit()
  
conn.close()
  executemany()方法可以一次插入多条记录
sqli = "INSERT INTO user(name, password) VALUES(%s, %s)"  
cur.executemany(sqli, [
  
        ('IE', '1021'),
  
        ('Firefox', '9012'),
  
        ('windows', '6213')
  
    ]
  
)
  最佳实践:
  如果是插入数据,要执行commit操作,不然数据不会被写入数据库。最好是执行完所有的sql语句之后再commit,实践证明,这样会带来很大的速度提升。
  cur.execute(sqli, (value1, value2))  , 如果value的值存在不确定性,那么上面两条语句存在sql注入风险。
  例如,如果value是一段html代码,html代码中如果存在引号(单引号或者双引号),如果不加处理,那么sql语句就将被截断,将会引发插入错误。
  如果value中存在英文逗号,将会造成前面的key和后面的value不对应,也不能正确插入数据。
  如果value中存在反斜线 \,那么在python中反斜线后面的数据将被转义,如果不处理插入的话将会造成字符丢失或者其他不可遇见的结果。
  因为在 SQL 中和在 Python 中有好多含有特殊含义的符号,如果不能很好的处理的话将会出现好多问题,幸好MYSQLdb模块给我们提供了一个escape_string方法,用这个方法能自动处理好上面的问题,特别方便。
value = MySQLdb.escape_string(value)     # 该函数阻止 python字符串以及SQL转义  2、查
  也许你已经尝试了在python中通过
  >>>cur.execute("select  *  from  user")
  来查询数据表中的数据,但它并没有把表中的数据打印出来。
  来看看这条语句获得的是什么
  >>>aa=cur.execute("select * from user")
  >>>print aa
  5
  它获得的只是我们的表中有多少条数据。那怎样才能获得表中的数据呢?
# -*- coding: utf-8 -*-  

  
import MySQLdb
  

  
conn = MySQLdb.connect(
  host = 'localhost',
  port = 3306,
  user = 'root',
  passwd = '123456',
  db = 'test',
  charset = 'utf8'
  
)
  

  
cur = conn.cursor()
  

  
# 获取表中共有多少条记录
  
sqls = "SELECT * FROM user"
  
num = cur.execute(sqls)
  
print num
  

  
# 打印
  
info = cur.fetchmany(num)
  
for line in info:
  print line
  

  
cur.close()
  
conn.commit()
  
conn.close()
  查询通常有两种方式:
  一种是使用cursor.fetchall()获取所有查询结果,然后再一行一行的迭代;
  另一种每次通过cursor.fetchone()获取一条记录,直到获取的结果为空为止。看一下下面的例子:
import MySQLdb  

  
try:
  
    conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306)
  
    cur = conn.cursor()
  

  
    conn.select_db('test')
  

  
    sqls = "SELECT id, name, password FROM user"
  
    cur.execute(sqls)
  
    rows = cur.fetchall()
  
    for row in rows:
  print '%s, %s, %s' % (row[0], row[1], row[2])
  
    print 'Number of rows returned: %s' % (cur.rowcount)
  

  
    ##############
  

  
    sqls = "SELECT id, name, password FROM user"
  
    cur.execute(sqls)
  
    while True:
  
        row = cur.fetchone()
  
        if row == None:
  
                break
  
        print '%s, %s, %s' % (row[0], row[1], row[2])
  

  
    print 'Number of rows returned: %s' % (cur.rowcount)
  

  
    #############
  

  
    cur.scroll(0,mode = 'absolute')    # 移动游标
  
    results = cur.fetchmany(5)
  
    for r in results:
  
        print r
  

  
    conn.commit()
  
    cur.close()
  
    conn.close()
  

  
except MySQLdb.Error,e:
  
     print "Mysql Error %d: %s" % (e.args[0], e.args[1])
  下面贴一下常用的函数:
  conn连接对象也提供了对事务操作的支持,标准的方法
  commit() 提交
  rollback() 回滚
  cursor用来执行命令的方法:
  callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
  execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
  executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
  nextset(self):移动到下一个结果集
  cursor用来接收返回值的方法:
  fetchall(self):接收全部的返回结果行.

  fetchmany(self,>  fetchone(self):返回一条结果行.
  scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-547966-1-1.html 上篇帖子: python编写登录接口(上) 下篇帖子: python学习笔记:字典
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表