Python连接MySQL数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

linux和windows下安装并启动mysql数据库

python安装MySQLdb包,建议使用pip安装

pip使用方法如下:

yum install python-pip    (优先安装python-pip才能使用pip)

pip类似于linux中的yum

pip install ipython    (安装python补全工具)

pip uninstall ipython    (使用pip卸载ipython)

pip list    (查看安装了哪些包)

pip install ipython==1.2.1    (适用于python2.6的版本)


MySQL索引

索引的概念

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

索引类别

1.普通索引

普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column =)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

2.唯一索引

普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。

如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE 把它定义为一个唯一索引。这么做的好处:一是简化了 MySQL 对这个索引的管理工作,这个索引也因此而变得更有效率;二是 MySQL 会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL 将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

3.主索引

在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是 PRIMARY 而不是 UNIQUE。

4.外键索引

如果为某个外键字段定义了一个外键约束条件,MySQL 就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

5.复合索引

索引可以覆盖多个数据列,如像 INDEX (columnA, columnB) 索引。这种索引的特点是 MySQL 可以有选择地使用一个这样的索引。如果查询操作只需要用到 columnA 数据列上的一个索引,就可以使用复合索引 INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX (A,B,C) 可以当做 A 或 (A,B) 的索引来使用,但不能当做 B、C 或 (B,C) 的索引来使用。


主键一定是唯一性索引,唯一性索引并不一定就是主键。 

一个表中可以有多个唯一性索引,但只能有一个主键。 

主键列不允许空值,而唯一性索引列允许空值。 

索引可以提高查询的速度。

例子:

import codecs

import MySQLdb

def connect_mysql():

    db_config = {

        'host': '192.168.1.1',

        'port': 3306,

        'user': 'zabbix',

        'passwd': '123456',

        'db': 'python',

        'charset': 'utf8'

    }

    cnx = MySQLdb.connect(**db_config)

    return cnx

if __name__ == '__main__':

    cnx = connect_mysql()

    sql1 = '''alter table Teacher add primary key(TID);'''

    sql2 = '''alter table Student add primary key(StdID);'''

    sql3 = '''alter table Score add primary key(SID);'''

    sql4 = '''alter table Course add primary key(CouID);'''

    sql5 = '''alter table Score add index idx_StdID_CouID(StdID, CouID);'''

    #删除索引

    sql6 = '''alter table Score drop  index idx_StdID_CouID;'''

    sql7 = '''explain select * from Score where StdID = 16213;'''

    try:

        cus = cnx.cursor()

        cus.execute(sql1)

        cus.close()

        cus = cnx.cursor()

        cus.execute(sql2)

        cus.close()

        cus = cnx.cursor()

        cus.execute(sql3)

        cus.close()

        cus = cnx.cursor()

        cus.execute(sql4)

        cus.close()

        cus = cnx.cursor()

        cus.execute(sql5)

        cus.close()

        cus = cnx.cursor()

        cus.execute(sql7)

        result = cus.fetchall()

        print(result)

        cus.close()

        cnx.commit()

    except Exception as e:

        cnx.rollback()

        print('error')

        raise e

    finally:

        cnx.close()

查看查询是否走索引需要加explain关键字,如mysql> explain select * from Score where StdID = 16213;



python连接mysql

例子:

定义一个connect_mysql函数,在函数中指定mysql连接参数,如下所示

import MySQLdb

def connect_mysql():

    db_config = {

        'host': '192.168.1.1',

        'port': 3306,

        'user': 'zabbix',

        'passwd': '123456',

        'db': 'zabbix_user',

        'charset': 'utf8'

    }

try:

    cnx = MySQLdb.connect(**db_config)

except Exception as e:

        raise e

    return cnx

connect_mysql()


游标操作

例子:

import MySQLdb

def connect_mysql():

    db_config = {

        'host': '192.168.1.1',

        'port': 3306,

        'user': 'zabbix',

        'passwd': '123456',

        'db': 'python',

        'charset': 'utf8'

    }

    try:

    cnx = MySQLdb.connect(**db_config)

except Exception as e:

        raise e

    return cnx

if __name__ == '__main__':

    cnx = connect_mysql()

    #cursor():创建游标对象

    cus = cnx.cursor()

    sql  = '''create table test(id int not null);insert into test(id) values (100);'''

    try:

        #excute(sql[, args]):执行一个数据库查询或命令

        cus.execute(sql)

#close():关闭此游标对象

        cus.close()

#提交游标对象

        cnx.commit()

    except Exception as e:

#回滚游标对象到commi之前

        cnx.rollback()

        raise e

    finally:

        cnx.close()


例子2:

#fetch函数的用法

#可以将例子1中的函数直接导入到此例子中使用,如下

#from 例子1 import connect_mysql

import MySQLdb

def connect_mysql():

    db_config = {

        'host': '192.168.1.1',

        'port': 3306,

        'user': 'zabbix',

        'passwd': '123456',

        'db': 'python',

        'charset': 'utf8'

    }

    cnx = MySQLdb.connect(**db_config)

    return cnx

if __name__ == '__main__':

    cnx = connect_mysql()

    #创建游标对象

    cus = cnx.cursor()

    sql  = '''select * from zabbix_user;'''

    try:

        cus.execute(sql)

#查看一行

        result1 = cus.fetchone()

        print('result1:')

        print(result1)

#查看两行,接着上次查询开始

        result2 = cus.fetchmany(2)

        print('result2:')

        print(result2)

#查看剩余所有行内容

        result3 = cus.fetchall()

        print('result3:')

        print(result3)

cus.close()

        cnx.commit()

    except Exception as e:

        cnx.rollback()

        print('error')

        raise e

    finally:

        cnx.close()

例子3:

#运行多个sql语句

import MySQLdb

def connect_mysql():

    db_config = {

        "host": "192.168.1.1",

        "port": 3306,

        "user": "xiang",

        "passwd": "123456",

        "db": "python",

        "charset": "utf8"

    }

    try:

        cnx = MySQLdb.connect(**db_config)

    except Exception as e:

        raise e

    return cnx

if __name__ == "__main__":

    sql = "select * from tmp;"

    sql1 = "insert into tmp(id) value (%s);"

    param = []

    for i in xrange(100, 130):

        param.append([str(i)])

    print(param)

    cnx = connect_mysql()

    cus = cnx.cursor()

    print(dir(cus))

    try:

        cus.execute(sql)

        cus.executemany(sql1, param)

        result1 = cus.fetchone()

        print("result1")

        print(result1)

        result2 = cus.fetchmany(3)

        print("result2")

        print(result2)

        result3 = cus.fetchall()

        print("result3")

        print(result3)

        cus.close()

        cnx.commit()

    except Exception as e:

        cnx.rollback()

        raise e

    finally:

        cnx.close()

数据库连接池的使用方法

python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的。

python的数据库连接池包 DBUtils,可以使用pip安装

例子1:

import MySQLdb

from DBUtils.PooledDB import PooledDB

db_config = {

        "host": "192.168.1.1",

        "port": 3306,

        "user": "zabbix",

        "passwd": "123456",

        "db": "python",

        "charset": "utf8"

    }

#连接池里的最少连接数为5

pool = PooledDB(MySQLdb, 5, **db_config)

#以后每次需要数据库连接就是用connection()函数获取连接就好了

conn = pool.connection()

cur = conn.cursor()

SQL = "select * from tmp;"

r = cur.execute(SQL)

r = cur.fetchall()

print(r)

cur.close()

conn.close()


MySQL表的建立

例子:

import MySQLdb

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

if __name__ == '__main__':

    cnx = connect_mysql()

    cus = cnx.cursor()

    # sql  = '''insert into student(id, name, age, gender, score) values ('1001', 'ling', 29, 'M', 88), ('1002', 'ajing', 29, 'M', 90), ('1003', 'xiang', 33, 'M', 87);'''

    student = '''create table Student(

            StdID int not null,

            Std




本文转自 粗粮面包 51CTO博客,原文链接:http://blog.51cto.com/culiangmianbao/1983635,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
139 68
|
1月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
256 15
|
2月前
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
199 4
|
2月前
|
安全 关系型数据库 MySQL
【赵渝强老师】MySQL的连接方式
本文介绍了MySQL数据库服务器启动后的三种连接方式:本地连接、远程连接和安全连接。详细步骤包括使用root用户登录、修改密码、创建新用户、授权及配置SSL等。并附有视频讲解,帮助读者更好地理解和操作。
338 1
|
3月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
311 6
|
3月前
|
关系型数据库 MySQL 数据处理
探索Python中的异步编程:从asyncio到异步数据库操作
在这个快节奏的技术世界里,效率和性能是关键。本文将带你深入Python的异步编程世界,从基础的asyncio库开始,逐步探索到异步数据库操作的高级应用。我们将一起揭开异步编程的神秘面纱,探索它如何帮助我们提升应用程序的性能和响应速度。
|
3月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
3月前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
333 1
|
SQL 关系型数据库 MySQL
Python中连接MySQL数据库并进行增删改查操作
Python中连接MySQL数据库并进行增删改查操作
91 1
|
SQL 关系型数据库 MySQL
使用python连接MySQL数据库,进行增删改查,实现步骤
在Python中连接MySQL数据库并进行增删改查操作,我们需要使用一个库叫做pymysql。
282 4