美文网首页
python操作mysql

python操作mysql

作者: g_ices | 来源:发表于2020-05-19 08:41 被阅读0次

下载库:在命令行输入

pip install pymysql

下载后可检验一下是否成功下载。直接在命令行进入python然后导库即可

C:\Users\June>python

Python 3.6.3 |Anaconda, Inc.| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import pymysql

>>>

连接数据库
  import pymysql
  # 连接数据库
  db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')
  以上的参数是必填的
  · host: 这个是ip地址,因为我这里是本地的,所以填127.0.0.1,也可以填localhost。
  · user:用户名,如果你也是本地的,就填root好了
  · passwd:这个是密码,填上你自己设的密码就可以了
  · db:这个是数据库名,我这里选的是news数据库
  · port:这个是端口,本地的一般都是3306
  · charset:这个是编码方式,要和你数据库的编码方式一致,要不会连接失败
  连接上了,怎么验证呢?这里我们可以选择查一条数据

try:
    db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')

    # 检验数据库是否连接成功
    cursor = db.cursor()

    # 这个是执行sql语句,返回的是影响的条数
    data = cursor.execute('SELECT * FROM `new`')

    # 得到一条数据
    one = cursor.fetchone()
    print(data)
    print(one)

except pymysql.Error as e:
    print(e)
    print('操作数据库失败')

finally:
    # 如果连接成功就要关闭数据库
    if db:
        db.close()

代码解读:因为在连接数据库中,有时会发生连接失败等异常,所以这里就进行捕捉异常,这里的异常都是在 pymsql.Error 里面。上面的代码看不懂也没关系,因为我接下来会说,如果运行后有结果证明连接成功。
  在用完后,一定要记得关闭数据库连接,防止资源泄露问题。

对数据进行查询

import pymysql
try:
    conn = pymysql.connect(host='127.0.0.1',user='root',passwd='password',db='news',charset='utf8',port=3306)
    # 这个是光标,用来操作数据库语句
    cursor = conn.cursor()
    # 执行sql语句
    cursor.execute('SELECT * FROM `new`')
    print(cursor.fetchone())
    # 关闭光标
    cursor.close()
except pymysql.Error as e:
    print(e)
    print('操作数据库失败')
finally:
    if conn:
        conn.close()

代码解读:
  · cursor():这个是光标,用来执行mysql语句的,用完后也是需要关闭的
  · excute():这个是执行语句,执行参数的mysql语句
  · fetchone():这个是查看执行语句后的一条数据
  · fetchall():这个是查看所有数据
  在查询数据后,返回的是一整条数据,有没有可以按字典形式来查询的呢?来试试!

print(cursor.fetchone()['name'])
Traceback (most recent call last):
File "E:/anaconda/python_project/mysql_test/test2.py", line 8, in <module>
print(cursor.fetchone()['name'])
TypeError: tuple indices must be integers or slices, not str

查了之后,编译器想都不想就给了我这个错误,说这是个元组,不能这样操作。
  虽然python没有提供,但是我们可以手动转成字典来查询啊
  cursor这里有个属性:description。获取的是数据库每个栏位情况,如下:

print(cursor.description)
# 下面是结果
(('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False), 
('title', 253, None, 50, 50, 0, False), ('content', 253, None, 2000, 2000, 0, False), 
('view_count', 3, None, 11, 11, 0, False), ('release_time', 12, None, 19, 19, 0, False), 
('author', 253, None, 20, 20, 0, True), ('from', 253, None, 20, 20, 0, True), 
('is_valibale', 3, None, 11, 11, 0, False)

所以,我们利用这个属性手动生成字典

# 将一条数据转成字典方便查找
new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))
print(new)
# 下面是结果
{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 'content': 
'他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 
'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 
'author': 'xiaoylin', 'from': '腾讯体育', 'is_valibale': 1}
这里利用zip函数和列表生成式来一行代码就生成成功了
用字典来查询,现在就可以了
print(new['title'])
# 下面是结果
考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福

但是,上面的只是一条数据的,如果是多条的呢?再按上面的方法就行不通了。这时就需要用到map函数了

def new2dict(new):
    return dict(zip([x[0] for x in cursor.description],[x for x in new]))
    news_list = list(map(new2dict,cursor.fetchall()))
    print(news_list)
# 下面是结果
[{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 
'content': '他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 
'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 
'author': 'xiaoylin', 'from': '腾讯体育', 'is_valibale': 1}, 
{'id': 3, 'type': 'NBA', 'title': '火箭挖21分大哈登得背锅 连遭浓眉大帽太尴尬', 
'content': '火箭在客场以113-115惜败于鹈鹕,4连胜终结。詹姆斯-哈登出战34分钟16投5中,
其中三分球9投只有1中,罚球14罚12中,拿到23分、11助攻、5篮板但也有4次失误,其在场正负值为尴尬的-12分', 
'view_count': 7520, 'release_time': datetime.datetime(2018, 1, 27, 12, 5), 
'author': 'youngcao', 'from': '腾讯体育','is_valibale': 1}, 
{'id': 4, 'type': '英超', 'title': '足总杯-曼联4-0英乙球队晋级 桑神首秀造两球', 
'content': '2017-18赛季英格兰足总杯第4轮,曼联客场4比0击败英乙球队约维尔,顺利晋级下一轮。桑切斯迎来曼联首秀,并制造了两个入球', 
'view_count': 6560, 'release_time': datetime.datetime(2018, 1, 27, 5, 49), 
'author': 'ricazhang', 'from': '腾讯体育','is_valibale': 1}, 
{'id': 5, 'type': '英超', 'title': '这才配红魔7号!桑神首秀大腿级表演 回击嘘声质疑', 
'content': '在今天凌晨对阵约维尔的首秀也值得期待。虽然在登场的72分钟时间里没有进球,但送出1次助攻且有有6次威胁传球的数据还是十分亮眼', 
'view_count': 2760, 'release_time': datetime.datetime(2018, 1, 27, 6, 13), 
'author': 'yaxinhao', 'from': '腾讯体育', 'is_valibale': 1}]

这里很巧妙的利用了map函数,因为多条数据就可以进行迭代了,需要操作每条数据,这样就可以想到map函数
  接下来我们再用面向对象的方法来用python进行查询数据库

import pymysql

class MysqlSearch(object):
    def get_conn(self):
    '''连接mysql数据库'''
        try:
            self.conn = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',port=3306,charset='utf8',db='news')
        except pymysql.Error as e:
            print(e)
            print('连接数据库失败')

    def close_conn(self):
    '''关闭数据库'''
        try:
            if self.conn:
                self.conn.close()
        except pymysql.Error as e:
            print(e)
            print('关闭数据库失败')

    def get_one(self):
    '''查询一条数据'''
        try:
            # 这个是连接数据库
            self.get_conn()
            # 查询语句
            sql = 'SELECT * FROM `new` WHERE `type`=%s'
            # 这个光标用来执行sql语句
            cursor = self.conn.cursor()
            cursor.execute(sql,('英超',))
            new = cursor.fetchone()
            # 返回一个字典,让用户可以按数据类型来获取数据
            new_dict = dict(zip([x[0] for x in cursor.description],new))
            # 关闭cursor
            cursor.close()
            self.close_conn()
            return new_dict
        except AttributeError as e:
            print(e)
            return None

    def get_all(self):
    '''获取所有结果'''
        sql = 'SELECT * FROM `new` '
        self.get_conn()
        try:
            cursor = self.conn.cursor()
            cursor.execute(sql)
            news = cursor.fetchall()
            # 将数据转为字典,让用户根据键来查数据
            news_list =list(map(lambda x:dict(zip([x[0] for x in cursor.description],[d for d in x])),news))
            # 这样也行,连续用两个列表生成式
            news_list = [dict(zip([x[0] for x in cursor.description],row)) for row in news]
            cursor.close()
            self.close_conn()
            return news_list
        except AttributeError as e:
            print(e)
            return None

def main():
    # 获取一条数据
    news = MysqlSearch()
    new = news.get_one()
    if new:
        print(new)
    else:
        print('操作失败')

    # 获取多条数据
    news = MysqlSearch()
    rest = news.get_all()
    if rest:
        print(rest)
        print(rest[7]['type'],rest[7]['title'])
        print('类型:{0},标题:{1}'.format(rest[12]['type'],rest[12]['title']))
        for row in rest:
            print(row)
    else:
        print('没有获取到数据')

if __name__ == '__main__':
    main()

这样就可以通过实例的方法来进行查询数据库了
  我们还可以根据页数来进行查询指定的数据数

def get_more(self,page,page_size):
'''查多少页的多少条数据'''
    offset = (page-1)*page_size
    sql = 'SELECT * FROM `new` LIMIT %s,%s'
    try:
        self.get_conn()
        cursor = self.conn.cursor()
        cursor.execute(sql,(offset,page_size,))
        news = [dict(zip([x[0] for x in cursor.description],new)) for new in cursor.fetchall()]
        cursor.close()
        self.close_conn()
        return news
    except AttributeError as e:
        print(e)
        return None

def main():
    #获取某页的数据
    news = MysqlSearch()
    new = news.get_more(3,5)
    if new:
        for row in new:
        print(row)
    else:
        print('获取数据失败')

if __name__ == '__main__':
    main()

利用的是mysql的limit关键字,还有其他的,比如进行排序分组的感兴趣的可以自己尝试下

增加数据到数据库

def add_one(self):
    sql = 'INSERT INTO `new`(`title`,`content`,`type`,`view_count`,`release_time`) VALUE(%s,%s,%s,%s,%s)'
    try:
        self.get_conn()
        cursor = self.conn.cursor()
        cursor.execute(sql, ('title', 'content', 'type', '1111', '2018-02-01'))
        cursor.execute(sql, ('标题', '内容', '类型', '0000', '2018-02-01'))
        # 一定需要提交事务,要不不会显示,只会占位在数据库
        self.conn.commit()
        return 1
    except AttributeError as e:
        print('Error:', e)
        return 0
    except TypeError as e:
        print('Error:', e)
    # 发生错误还提交就是把执行正确的语句提交上去
    # self.conn.commit()
    # 下面这个方法是发生异常就全部不能提交,但语句执行成功的就会占位
        self.conn.rollback()
        return 0
    finally:
        cursor.close()
        self.close_conn()

def main():
    news = OperateSQL()
    if news.add_one():
        print('增加数据成功')
    else:
        print('发生异常,请检查!!!')

if __name__ == '__main__':
    main()

相关文章

  • 使用 pymysql 进行增删查改

    参考文章 用python实现接口测试(四、操作MySQL) python3使用pymysql操作mysql 安装 ...

  • mysql+python

    安装MySQL-python 要想使python可以操作mysql 就需要MySQL-python驱动,它是pyt...

  • pycharm连接mysql

    python操作MySQL(简单流程)

  • 05-Mysql数据库03

    mysql与python交互 拆表 python中操作mysql 安装pymysqlsudo pip instal...

  • 搜企网爬虫作业

    作业要求 (1)csv文件数据写入(2)mysql 操作,python mysql操作 这个需要安装mysql以及...

  • (十四) 学习笔记: 使用Python对Mysql Mongo

    一. Python对MySQL的操作 (1) 安装模块pip install pymysql(2) 操作mysql...

  • python作业-20170601

    作业:(1)csv文件数据写入(2)mysql 操作,python mysql操作 这个需要安装mysql以及p...

  • MySQL&python交互

    MySQL&python交互 一、Python操作MySQL步骤(原始的执行SQL语句) 引入pymysql模块 ...

  • Python3-mysql

    此文章记录一下python对mysql的一些操作方式、方法。 *python如何连接mysql ? python ...

  • Python操作MySQL

    Python操作MySQL 一. python操作数据库介绍 Python 标准数据库接口为 Python DB-...

网友评论

      本文标题:python操作mysql

      本文链接:https://www.haomeiwen.com/subject/ahlvohtx.html