Python: 操作MySQL数据库

Python操作MySQL数据库

前几天数据库课程的一个小project,需要接入MySQL数据库,导入数据,写了个脚本,做简单的CRUD操作,用Python实现,简单地记录一下。

依赖

可以用MySQL-python来连MySQL,安装很简单,pip install MySQL-python,然后在脚本里引入import MySQLdb即可。有不止一个库实现类似的功能,API大同小异。

连接

首先要做的是链接数据库,当然要确保你MySQL Server是安装运行的,用homebrew安装的话brew install mysql

链接数据库之后,会返回一个cursor,主要通过这个cursor执行SQL语句,操作数据库。比如有一个数据库叫MusicDB,链接的函数如下。

import MySQLdb
def connect_db():
    """Connect database and return db and cursor"""
    db = MySQLdb.connect(host="localhost",user='root',
                         passwd='PASSWD'',db="MusicDB")
    cursor = db.cursor()
    return db, cursor

当然如果想确认下有没有链接成功的话,可以用如下代码。

db, cursor = connect_db()
cursor.execute("SELECT VERSION()")
data = cursor.fetchone()
print "Database version : %s " % data
db.close()

运行脚本,如果看到类似这样的输出Database version : 5.0.45,表明就ok了。

检查表的存在

有时候可能需要不知一次修改数据库的表,不想直接在terminal里写sql,想直接修改脚本,重新跑一下,直接删除表,需要看下表是否存在。MySQL里有个表information_schema.tables包含数据库表的信息。

def table_exists(table_name):
    """Check table existence base on table name"""
    db, cursor = connect_db()
    cursor.execute("SELECT * FROM information_schema.tables \
                   WHERE table_name = '%s'" % table_name)
    nrows = int(cursor.rowcount); db.close()
    return False if nrows == 0 else True

创建表

链接数据库,定义个CREATE TABLE语句,执行即可,具体table里有哪些字段,当然是根据实际情况喽。这里的例子是歌手信息,比如有名字,他的网址,以及播放次数。

def create_table_artist():
     # Connect database
    db, cursor = connect_db()
    sql = """CREATE TABLE artist(
             name CHAR(50) NOT NULL,
             url CHAR(80),
             playcount INT)"""
    if not table_exists('artist'):
        cursor.execute(sql)
    # remember to disconnect from server
    db.close()

删除表

当然了,删除表不是一个常见的操作,不过偶然可能用到。

def drop_table(table_name):
    db, cursor = connect_db()
    if table_exists(table_name):
        sql = """DROP TABLE %s""" % table_name
        cursor.execute(sql)
    db.close()

插入INSERT

我们从外部读入数据之后,可以把这些数据插入到数据库中,具体的toy数据开心用啥就用啥喽。插入数据的时候,如果数据不符合创建表时候的定义,就会抛出错误,我们需要简单地处理下。如果try成功了,那就db.commit()将改变写入到数据库,如果try失败,那就db.rollback()回来。记得要db.commit()哦,要不然那个表总是一行数据都没有。

def insert_into_artist():
    artists = load_json('artists.json')       
    db, cursor = connect_db()
    sql = """INSERT INTO artist(name, url, playcount)
           VALUES ('%s',  '%s', '%d')"""
    for a in artists:
        try:
              # remember to convert playcount to integer
            tp = (a['name'], a['url'], int(a['playcount']))
            cursor.execute(sql % tp)
            db.commit()
        except:
            db.rollback()
    db.close()

删除DELETE

删除操作也很类似,定义sql语句,execute即可,如果失败就rollback回来。如果表里一个字段是其他表的Foreign Key的话,直接删除这条记录就会抛出错误,所以需要考虑下这种异常情况。

def delete_artist(artist):
    db, cursor = connect_db()
    sql = "DELETE FROM artist WHERE name='%s'" % artist
    try:
        cursor.execute(sql)
        db.commit()
    except:
        db.rollback()
    db.close()  

更新UPDATE

比如每次有人播放一首歌,我们想把这个歌手的播放次数加一,可以用UPDATE语句实现。

def update_artist(artist):
    db, cursor = connect_db()
    sql = "UPDATE artist SET playcount = playcount + 1 WHERE name='%s'" % artist
    try:
        cursor.execute(sql)
        db.commit()
    except:
        db.rollback()
    db.close()  

查找SELECT

这个稍微复杂点,主要的API有fetchone()fetchall()rowcount。比如想找出播放次数大于十万的所有歌手,可以这样实现。

def top_artists():
    db, cursor = connect_db()
    sql = "SELECT * FROM artist WHERE playcount > '%d' " % 100000
    try:
        cursor.execute(sql)
        return cursor.fetchall()
    execept:
        print("Error in fetching data")
    db.close()

results = top_artists()
for row in results:
    name = row[0]
    print(name) 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏匠心独运的博客

数据库技术之记一次排查DB死锁的分析与思考

虽然很多童鞋在学数据库课程时都了解数据库隔离级别、死锁和事务等概念,但在测试/线上环境遇到死锁却不一定能够及时分析并解决这类问题。本文主要以作者在测试环境中遇到...

1591
来自专栏chenssy

【死磕Sharding-jdbc】---结果合并总结

这句SQL会使得MySQL在无法利用索引的情况下跳过1000000条记录后,再获取10条记录,其性能可想而知。而在分库分表的情况下(假设分为2个库),为了保证数...

1353
来自专栏小怪聊职场

MySQL(七)|MySQL分库分表的那点事(小怪的Java群第一次话题讨论)

2474
来自专栏MYSQL轻松学

MySQL 面试选择题15道(单选)

1、MySQL数据库四种特性,不包括() A.原子性 B.事务性 C.一致性 D.隔离性 2、MySQL报错error 1062 的意思是() A.连接数据库失...

5496
来自专栏L宝宝聊IT

索引、视图、存储过程和触发器的应用

1548
来自专栏友弟技术工作室

MySQL优化思路及框架

MySQL优化框架 1. SQL语句优化 2. 索引优化 3. 数据库结构优化 4. InnoDB表优化 5. MyISAM表优化 6. Memory表优化 7...

36310
来自专栏杨建荣的学习笔记

MySQL 5.7 General Tablespace学习(r11笔记第34天)

MySQL里面的文件蛮有意思,之前大体有两个参数来做基本的控制。一个是innodb_data_file_path就是一个共享表空间,数据都往这一个文件里放,也就...

3649
来自专栏携程技术中心

干货 | 一个MySQL 5.7 分区表性能下降的案例分析

作者简介 姜宇祥,2012年加入携程,10年数据库核心代码开发经验,相关开发涉及达梦,MySQL数据库。现致力于携程MySQL的底层研发,为特殊问题定位和处理提...

4347
来自专栏Java技术交流群809340374

MySQL有哪些存储引擎,各自的优缺点,应用场景

经常面试都会问到MYSQL有哪些存储引擎,以及各自的优缺点。今天主要分享常见的存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB...

1663
来自专栏Hongten

python开发_sqlite3_绝对完整_博主推荐

=========================================

814

扫码关注云+社区