zoukankan      html  css  js  c++  java
  • 数据库实践

                       数据库实践

    一、Python操作数据库学习笔记

    1 Python标准数据库接口DB-API介绍

    Python标准数据库接口为 Python DB-API,它为开发人员提供了数据库应用编程接口。Python DB-API支持很多种的数据库,你可以选择跟自己项目相关的数据库。Python DB-API支持的数据库如下所示:

    • GadFly
    • mSQL
    • MySQL
    • PostgreSQL
    • Microsoft SQL Server 2000
    • Informix
    • Interbase
    • Oracle
    • Sybase

    不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。 Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。

    Python DB-API使用流程:

    1) 引入 API 模块。

    2) 获取与数据库的连接。

    3) 执行SQL语句和存储过程。

    4) 关闭数据库连接。

    Python的数据库学习,主要在于学习DB-API的学习流程,记住这四步,你就已经成功了一大半了。

     

    2 MySQL的安装

    因为博主目前只关注MySQL的使用,所以本文中只限于介绍如何利用Python来操作MySQL数据库。下面简单介绍一下如何为自己的Python IDE安装MySQL:

     确认是否已经安装有MySQL, 执行以下代码:

    # encoding: utf-8
    #!/usr/bin/python
    
    import MySQLdb

    如果执行后报错就说明没有安装MySQL,否则则证明你已经无需安装MySQL。

     

    3 数据库连接

    连接数据库前,请先确认以下事项:连接数据库TESTDB使用的用户名为 "testuser" ,密码为 "test123",你可以可以自己设定或者直接使用root用户名及其密码。

    以下实例链接Mysql的TESTDB数据库,对应了DB-API的四个步骤:# encoding: utf-8

    #!/usr/bin/python
    
    # 1 引入API模块
    import MySQLdb

    # 2 获取与数据库的连接
    # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

    # 3 执行SQL语句和存储过程 # 使用cursor()方法获取操作游标 cursor = db.cursor() # 使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取一条数据库。 data = cursor.fetchone() print "Database version : %s " % data
    # 4 关闭数据库连接 # 关闭数据库连接 db.close()

    执行结果显示:

    Database version : 5.0.45

    4 创建数据库表

    我们尝试建立一个自定义的数据库表:

    数据库表名称:EMPLOYEEEMPLOYEE

    数据表字段为:FIRST_NAME,LAST_NAME,AGE,SEX 和 INCOME。

    # encoding: utf-8
    #!/usr/bin/python
    import MySQLdb
    # 打开数据库连接
    db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
    # 如果数据表已经存在使用 execute() 方法删除表。
    cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
    # 创建数据表SQL语句
    sql = """CREATE TABLE EMPLOYEE (
        FIRST_NAME  CHAR(20) NOT NULL,
        LAST_NAME  CHAR(20),
        AGE INT,  
        SEX CHAR(1),
        INCOME FLOAT )"""
    cursor.execute(sql)
    # 关闭数据库连接
    db.close()

     

    5 插入数据操作

    使用SQL INSERT 语句向数据库表 EMPLOYEE 插入记录:    

    # encoding: utf-8
    #!/usr/bin/python
    import MySQLdb
    # 打开数据库连接
    db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
    # SQL 插入语句
    sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
                LAST_NAME, AGE, SEX, INCOME)
                VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
    try:
        # 执行sql语句
        cursor.execute(sql)
        # 提交到数据库执行
        db.commit()
    except:
        # Rollback in case there is any error
        db.rollback()
    # 关闭数据库连接
    db.close()

    在这里提几个重要的点:

    1) 请 注意一定要有conn.commit()这句来提交事务,要不然不能真正的插入数据。

    2)dollback()是回滚操作,回滚(Rollback)指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。回滚包括程序回滚和数据回滚等类型。

     

    6 数据库查询操作

    Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

    • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
    • fetchall(): 接收全部的返回结果行.
    • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

    查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:

    # encoding: utf-8
    #!/usr/bin/python
    import MySQLdb
    # 打开数据库连接
    db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
    # SQL 查询语句
    sql = "SELECT * FROM EMPLOYEE 
             WHERE INCOME > '%d'" % (1000)
    try:
        # 执行SQL语句
        cursor.execute(sql)
        # 获取所有记录列表
        results = cursor.fetchall()
        for row in results:
            fname = row[0]
            lname = row[1]
            age = row[2]
            sex = row[3]
            income = row[4]
            # 打印结果
            print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % 
                     (fname, lname, age, sex, income )
    except:
        print "Error: unable to fecth data"
    # 关闭数据库连接
    db.close()

    执行结果显示:

    fname=Mac, lname=Mohan, age=20, sex=M, income=2000

    7 数据库更新操作

    更新操作用于更新数据表的的数据,以下实例将 TESTDB表中的 SEX 字段全部修改为 'M',AGE 字段递增1:

    # encoding: utf-8
    #!/usr/bin/python
    import MySQLdb
    # 打开数据库连接
    db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
    # SQL 更新语句
    sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
                                      WHERE SEX = '%c'" % ('M')
    try:
        # 执行SQL语句
        cursor.execute(sql)
        # 提交到数据库执行
        db.commit()
    except:
        # 发生错误时回滚
        db.rollback()
    # 关闭数据库连接
    db.close()

     

    8 常用函数

    下面总结一下常用的函数:

    1) Connect() 方法用于创建数据库的连接,里面可以指定参数:用户名,密码,主机等信息。这只是连接到了数据库,要想操作数据库需要创建游标。

    2)commit() 提交

    3)rollback() 回滚

    4)cursor用来执行命令的方法:

    callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数

    execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数

    executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数

    nextset(self):移动到下一个结果集

    5)cursor用来接收返回值的方法:

    fetchall(self):接收全部的返回结果行.

    fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.

    fetchone(self):返回一条结果行.

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

    二、建立数据库

    1、要求:

      

            

      

    2、实操:

    a、把文件写入数据库

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Sat Jun  1 11:06:50 2019
    
    @author: Administrator
    """
    
    import sqlite3
    import openpyxl
    #import pandas as pd
    lists=sqlite3.connect('D:/我的文件/Python作业/MyDatabase.db') 
    c=lists.cursor()
    #c.execute('''CREATE TABLE rankg("序号","排名","学校名称","省市","总分","生源质量","培养结果","科研规模","科研质量","顶尖成果","顶尖人才","科技服务","产学研合作","成果转化")''')
    #import pandas as pd
    
    #def csv_to_xlsx_pd():
    #csv = pd.read_csv('D:/我的文件/Python作业/CrawUniv.csv', encoding='gbk')
    #csv.to_excel('D:/我的文件/Python作业/CrawUniv.xlsx', sheet_name='data')
    listinsheet=openpyxl.load_workbook(r'D:/我的文件/Python作业/CrawUniv.xlsx')
    datainlist=listinsheet.active #获取excel文件当前表格
    data_truck=('''INSERT INTO rankg("序号","排名","学校名称","省市","总分","生源质量","培养结果","科研规模","科研质量","顶尖成果","顶尖人才","科技服务","产学研合作","成果转化") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)''')
    for row in datainlist.iter_rows(min_row=2,max_col=14,max_row=datainlist.max_row): 
    #使excel各行数据成为迭代器
        cargo=[cell.value for cell in row] #敲黑板!!使每行中单元格成为迭代器
        c.execute(data_truck,cargo)  #敲黑板!写入一行数据到数据库中表rankf
    for row in c.execute('SELECT * FROM rankg ORDER BY "序号"'):
        print(row)
    
    lists.commit()
    lists.close()

    显示结果如下:

      

    b、查询我们学校的排名和得分

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Mon Jun  3 00:49:23 2019
    
    @author: Administrator
    """
    
    import sqlite3
    import openpyxl
    lists=sqlite3.connect('D:/我的文件/Python作业/MyDatabase.db') 
    c=lists.cursor()
    #c.execute('''CREATE TABLE rankh("序号","排名","学校名称","省市","总分","生源质量","培养结果","科研规模","科研质量","顶尖成果","顶尖人才","科技服务","产学研合作","成果转化")''')
    listinsheet=openpyxl.load_workbook(r'D:/我的文件/Python作业/CrawUniv.xlsx')
    datainlist=listinsheet.active #获取excel文件当前表格
    data_truck=('''INSERT INTO rankh("序号","排名","学校名称","省市","总分","生源质量","培养结果","科研规模","科研质量","顶尖成果","顶尖人才","科技服务","产学研合作","成果转化") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)''')
    for row in datainlist.iter_rows(min_row=0,max_col=14,max_row=datainlist.max_row): 
    #使excel各行数据成为迭代器
        cargo=[cell.value for cell in row] #敲黑板!!使每行中单元格成为迭代器
        c.execute(data_truck,cargo)  #敲黑板!写入一行数据到数据库中表rankh
    c.execute('SELECT * FROM rankh WHERE "学校名称"="广东技术师范学院"')#榜上为广东技术师范学院
    r = c.fetchall()
    print(r)
    lists.commit()
    lists.close()

    结果显示如下:

      

    c、广东学校排名和评分(以“顶尖成果(高被引论文-篇)”为依据)

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Mon Jun  3 01:06:36 2019
    
    @author: Administrator
    """
    
    import sqlite3
    import openpyxl
    lists=sqlite3.connect('D:/我的文件/Python作业/MyDatabase.db') 
    c=lists.cursor()
    #c.execute('''CREATE TABLE rank9("序号","排名","学校名称","省市","总分","生源质量","培养结果","科研规模","科研质量","顶尖成果","顶尖人才","科技服务","产学研合作","成果转化")''')
    listinsheet=openpyxl.load_workbook(r'D:/我的文件/Python作业/CrawUniv.xlsx')
    datainlist=listinsheet.active #获取excel文件当前表格
    data_truck=('''INSERT INTO rank9("序号","排名","学校名称","省市","总分","生源质量","培养结果","科研规模","科研质量","顶尖成果","顶尖人才","科技服务","产学研合作","成果转化") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)''')
    for row in datainlist.iter_rows(min_row=2,max_col=14,max_row=datainlist.max_row): 
    #使excel各行数据成为迭代器
        cargo=[cell.value for cell in row] #敲黑板!!使每行中单元格成为迭代器
        c.execute(data_truck,cargo)  #敲黑板!写入一行数据到数据库中表rank9
    c.execute('SELECT * FROM rank9 WHERE "省市"="广东省" ORDER BY "顶尖成果"')
    r = c.fetchall()
    print(r)
    lists.commit()
    lists.close()

    结果显示如下:

      

    其实这几个程序只是倒数第五句有一点小改动罢了~~~~~~~

  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/sun0618-/p/10947265.html
Copyright © 2011-2022 走看看