ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Python操作数据库

2020-05-02 20:53:43  阅读:306  来源: 互联网

标签:__ cur Python 数据库 print sqlite3 操作 main con


最最最最常用的增删改查语句
1. create table 表名(
        属性1 数据类型 约束,
        属性2 数据类型 约数,
        ...
    )
2. insert into 表名(属性1,属性2...) values(值1,值2...)
3. delete from 表名 where 条件
4. update 表名 set 属性1=值1,属性2=值2... where 条件
5. select 属性1,属性2... from 表明 where 条件

操作SQLite3数据库

1. 从Python3.x版本开始,再标准库中已经内置了SQLite3模块,它可以支持SQLite3数据库的访问和相关的数据库操作.
    (1) Python语言使用SQLite3数据库只要导入SQLite3模块即可
2. Python语言操作SQLite3数据库的基本流程如下:
    (1) 导入相关库或模块( import sqlite3)
    (2) 使用connect()链接数据库并获取数据库连接对象. 它提供了一下方法:
        1) cursor() 创建一个游标对象
        2) commit() 处理事务提交
        3) rollback() 处理事务回滚
        4) close() 关闭一个数据库连接
    (3) 使用con.cursor()获取游标对象
    (4) 使用游标对象的方法(execute(),executemany(),fetchall()等)来操作数据库,实现插入,修改和删除操作,并查询获取显示相关的记录.
    (5) 在Python程序中,连接函数sqlite3.connect()有两个常用参数:
        1) database: 表示要访问的数据库名 (数据库地址)
        2) timeout: 表示访问数据的超时设定
    (6) 使用close()关闭游标对象和数据库连接. 数据库操作完成之后,必须及时调用其close()方法关闭数据库连接,这样做的目的是减轻数据库服务器的压力.
3. 数据库知识补充, 增删改操作如果没有异常则提交事务,如果有异常则进行事务的回滚. 查询则不用进行事务的操作.

使用SQLite3创建表

# code01_操作sqlite创建表.py

"""
1. 导入sqlite3模块
2. 创建连接 sqlite3.connect(数据库路径,超时时间)
3. 创建游标对象
4. 编写创建表的sql语句
5. 执行sql语句
6. 关闭游标,关闭连接
"""

import os
import os.path
import sqlite3


def main():
    db_path = os.path.abspath(r"./DB/code01.db")
    con = sqlite3.connect(db_path)  # 这里创建连接,返回一个连接对象
    cur = con.cursor()
    sql = """\
    create table t_person(
        pno integer primary key autoincrement,
        pname varchar not null ,
        age integer 
    )
    """  # 使用文档字符串可以直接输入文本
    try:
        cur.execute(sql)
        print("创建表成功")
    except BaseException as e:
        print(e)
        print("创建表失败")
    finally:
        # 1. 关闭游标 2. 关闭连接
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

使用SQLite插入数据

调用游标对象的execute(sql,(值))执行插入sql
使用 executemany(sql,[(值1),(值2)...])执行多条sql语句
使用executemany()比循环使用excute()执行多条sql语句效率高

# code02_操作sqlite3向数据库插入一条数据.py


import sqlite3
import os


def main():
    try:
        db_path = os.path.abspath(r"./DB/code01.db")
        con = sqlite3.connect(db_path)
        cur = con.cursor()

        # 1. 自增长的字段是不需要插入数据的
        # 2. 这里的字段值使用 ? 来占位
        sql = """\
            insert into t_person(pname,age) values(?,?)
        """
        para = ("张三", 24)
        cur.execute(sql, para)  # 插入第一条数据
        cur.execute(sql, ("李四", 24))
        con.commit()  # 如果插入没有没有问题就进行事务的提交
        print("插入数据成功")
    except BaseException as e:
        print(e)
        print("插入数据失败")
        con.rollback()  # 如果插入失败,要进行事务回滚
    finally:
        cur.close()
        cur.close()


if __name__ == "__main__":
    main()

# code03_操作sqlite3向数据库插入多条数据.py


import os
import sqlite3


def main():
    db_path = os.path.abspath(r"./DB/code01.db")
    try:
        con = sqlite3.connect(db_path)
        cur = con.cursor()
        sql = """\
            insert into t_person(pname,age) values(?,?)
        """
        # 执行多次语句  cur.excutemany(sql,[(值1),(值2)...])
        cur.executemany(sql, [("刘一", 21), ("陈二", 22), ("王五", 25), ("赵六", 26), ("孙七", 27), ])
        con.commit()  # 插入没有异常则进行事务的提交
        print("插入数据成功")
    except BaseException as e:
        print(e)
        print("插入数据失败")
        con.rollback()  # 数据插入失败要进行事务回滚
    finally:
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

使用SQLite3查询数据

查询数据,游标对象提供了 fetchall() 和 fetchone()
fetchall() 获取所有数据,返回一个列表.
fetchone() 获取其中其中一个结果,返回一个元组

# code04_操作sqlite3查询所有数据.py


import os
import sqlite3


def main():
    db_path = os.path.abspath(r"./DB/code01.db")
    try:
        con = sqlite3.connect(db_path)
        cur = con.cursor()
        sql = """\
            select * from t_person
        """
        cur.execute(sql)  # 执行查询语句
        # 增删改查,只有查询是不需要提交事务的
        person_all = cur.fetchall()  # 获取结果集(返回的是元组)
        # print(person_all)
        for person in person_all:
            print(person)
    except Exception as e:
        print(e)
        print("查询失败")
    finally:
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

# code05_操作sqlite3查询一条数据.py

import os
import sqlite3


def main():
    db_path = os.path.abspath(r"./DB/code01.db")
    try:
        con = sqlite3.connect(db_path)
        cur = con.cursor()
        sql = """\
            select * from t_person
        """
        cur.execute(sql)
        person = cur.fetchone()  # 只获取一条数据
        print(person)

    except Exception as e:
        print(e)
        print("查询失败")
    finally:
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

使用sqlite3修改数据

# code06_操作sqlite3修改数据.py

import os
import sqlite3


def main():
    db_path = os.path.abspath(r"./DB/code01.db")
    try:
        con = sqlite3.connect(db_path)
        cur = con.cursor()
        sql = """\
            update t_person set pname=? where pno=?
        """
        cur.execute(sql, ("张三三", 1))
        con.commit()

        # 查询验证结果
        cur.execute("select * from t_person where pno=?", (1,))
        person = cur.fetchone()
        print(person)
    except Exception as e:
        print(e)
        print("修改数据失败")
        con.rollback()
    finally:
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

使用sqlite3删除数据

# code07_操作sqlite3删除数据.py

import os
import sqlite3


def main():
    db_path = os.path.abspath(r"./DB/code01.db")
    try:
        con = sqlite3.connect(db_path)
        cur = con.cursor()
        cur.execute("delete from t_person where pno=?", (1,))
        con.commit()
        print("删除成功")

    except Exception as e:
        print(e)
        print("删除失败")
        con.rollback()
    finally:
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

下载安装MySQL

手动配置MySQL非常麻烦...
推荐使用可视化的集成环境 PHPStudy, XMAPP (不要花费一堆时间在配置环境上,多花时间在业务上)

操作MySQL数据库

搭建pymysql环境

1. 在使用pymysql之前,我们需要确保pymysql已安装. 如果还未安装,我们可以使用一下命令安装最新版的pymysql
    pip install pymysql
2. 如果无法在线安装,进入python官网 www.python.org, 点击PyPI, 下载  xxx.whl, 然后本地使用pip进行安装
    pip install xxx.whl

参数化

1. sql语句的参数化,可以有效防止sql注入
2. 注意: 此处不同于Python的字符串格式化,全部使用%s占位(sqlite3中使用的是?占位)

创建数据库表

# code08_操作mysql创建数据表.py

# 导入相应数据库模块
import pymysql


def main():
    # sqlite3 是python3内置的,直接新建一个  xxx.db 就是一个数据库
    # sqlite3.connect(数据库地址)
    # 相对来说mysql就要正式很多了

    #   (*args,**kwargs)    (host=None, user=None, password="",database=None, port=0)
    try:
        con = pymysql.connect("localhost", "root", "root", "python_db", 3306)
        # 理解函数的可变参数,一定要按顺序传递   arg *args **kwargs
        # con = pymysql.connect("localhost", user="root", password="root", database="python_db", port=3306)
        cur = con.cursor()  # 创建游标对象
        sql = """\
            create table t_student(
                sno int primary key auto_increment,
                sname varchar(30) not null,
                age int(2), 
                score float(3,1)  
            )
        """
        cur.execute(sql)


    except BaseException as e:
        print(e)
        print("数据表创建失败")
    finally:
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

数据库插入操作

其实mysql和sqlite在python中的操作基本一致
需要注意(1)不同数据库的数据类型不同 (2) 参数化一个是 ? 一个是 %s
这里以插入为例子,后面不再赘述

# code09_操作mysql插入数据.py

import pymysql


def main():
    try:
        con = pymysql.connect(host="localhost", user="root", password="root", port=3306, database="python_db")
        cur = con.cursor()
        insert_sql = """\
            insert into t_student(sname,age,score) values(%s,%s,%s) 
        """
        para = [("刘一", 21, 98.5), ("陈二", 22, 96.0), ("张三", 23, 95.9), ("李四", 24, 93.5), ("王五", 25, 97.2)]
        cur.executemany(insert_sql, para) # 注意execute() 和 executemany()
        con.commit()
        print("插入数据成功")
    except Exception as e:
        print(e)
        print("插入数据失败")
        con.rollback()  # 增删改如果是要都要进行回滚
    finally:
        cur.close()
        con.close()


if __name__ == "__main__":
    main()

标签:__,cur,Python,数据库,print,sqlite3,操作,main,con
来源: https://www.cnblogs.com/Rowry/p/12818098.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有