Day20.python操作数据库

时间:2022-07-25
本文章向大家介绍Day20.python操作数据库,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

python操作MySQL模块

mysql-connector-python是MySQL官方提供的

PyMySQL支持python2和python3

MySQLdb只支持python2

本次课程要求:安装MySQL;案例中的账号密码更换为自己的(案例中的账号密码均为root);

安装PyMySQL模块

命令行:pip install pymysql

导入PyMySQL模块

import pymysql

获得连接对象

conn=pymysql.connect(host=' ',user=' ',password=' ',database=' ',charset='utf-8')

获取游标对象通过游标c对数据进行CRUD

提交事务

conn.commit()

关闭游标

c.close()

关闭连接

conn.close()

案例详解

创建数据库

'''创建数据库'''
import pymysql
#打开数据库连接,不需要指定数据库,因为需要创建数据库
conn = pymysql.connect('localhost',user = "root",passwd = "root")
#获取游标
cursor=conn.cursor()
#创建pythonBD数据库
cursor.execute('CREATE DATABASE IF NOT EXISTS pythonDB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;')
cursor.close()#先关闭游标
conn.close()#再关闭数据库连接
print('创建pythonBD数据库成功')

创建表

import pymysql
#打开数据库连接
conn = pymysql.connect('localhost',user = "root",passwd = "root",db = "myemployees")
#获取游标
cursor=conn.cursor()
print(cursor)

#创建user表
cursor.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""

cursor.execute(sql)
cursor.close()#先关闭游标
conn.close()#再关闭数据库连接
print('创建数据表成功')

表中插入单条数据

'''插入单条数据'''
import pymysql
#打开数据库连接,不指定数据库
conn=pymysql.connect('localhost','root','root')
conn.select_db('pythondb')

cur=conn.cursor()#获取游标

#创建user表
cur.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""

cur.execute(sql)

insert=cur.execute("insert into user values(1,'tom',18)")
print('添加语句受影响的行数:',insert)

#另一种插入数据的方式,通过字符串传入值
sql="insert into user values(%s,%s,%s)"
cur.execute(sql,(3,'kongsh',20))

cur.close()
conn.commit()
conn.close()
print('sql执行成功')

查询数据

'''fetchone'''
import pymysql
#打开数据库连接
conn=pymysql.connect('localhost','root','root')
conn.select_db('myemployees')
#获取游标
cur=conn.cursor()

cur.execute("select * from user;")
while 1:
    res=cur.fetchone()
    if res is None:
        #表示已经取完结果集
        break
    print (res)
cur.close()
conn.commit()
conn.close()
print('sql执行成功')

'''
(1, 'tom', 18)
(3, 'kongsh', 20)
sql执行成功
'''

CRUD

CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。

增删改的两种操作

操作单条:c.execute('SQL语句',(参数值))

操作多条:c.executemany('SQL语句',(多个参数值))

查的三种操作

拿单条:c.fetchone()

拿多条:fetchmany(size)

拿所有:c.fetchall()

SQLite数据库

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。

就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

数据类型

SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。

您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。

SQLite的主要数据类型有:NULL、INTEGER、REAL、TEXT、BLOB

python操作SQLite数据库

导入模块

import sqlite3  

创建/打开数据库

在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。

cx = sqlite3.connect("E:/test.db")  #这里创一个文件

也可以创建数据库在内存中。

con = sqlite3.connect(":memory:")

数据库连接对象

打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:

  1. commit()--事务提交
  2. rollback()--事务回滚
  3. close()--关闭一个数据库连接
  4. cursor()--创建一个游标

使用游标查询数据库

c = conn.cursor() #我们需要使用游标对象SQL语句查询数据库,获得查询对象。

游标对象有以下的操作:

  1. execute()--执行sql语句
  2. executemany--执行多条sql语句
  3. close()--关闭游标
  4. fetchone()--从结果中取一条记录,并将游标指向下一条记录
  5. fetchmany()--从结果中取多条记录
  6. fetchall()--从结果中取出所有记录
  7. scroll()--游标滚动

创建表

c.execute('''CREATE TABLE stocks(date text,trans text,symbol text,gty real,price real)''')

向表中插入一条数据

c.execute('''insert into stocks values('2016-01-05','BUY','RHAT',100,35.14)''')

下面为一个完整的案例演示

连接数据库

import sqlite3
#数据库名
db_name = "test.db"
#表名
table_name = "catalog"
conn = sqlite3.connect(db_name)

打开游标

rs=conn.cursor()

建表

sql = 'create table ' + table_name + ' (id varchar(20) primary key, pid integer, name varchar(10))'
try:
    rs.execute(sql)
    print("建表成功")
except:
    print("建表失败")

增删改查

#增:增加三条记录

sql = "Insert into " + table_name + " values ('001', 1, '张三')"
try:
     rs.execute(sql)
#提交事务
conn.commit()
    print("插入成功")
except:
    print("插入失败")
sql = "Insert into " + table_name + " values ('002', 2, '李四')"
try:
     rs.execute(sql)
#提交事务
conn.commit()
     print("插入成功")
except:
     print("插入失败")
sql = "Insert into " + table_name + " values ('003', 3, '王五')"
try:
     rs.execute(sql)
#提交事务
conn.commit()
     print("插入成功")
except:
    print("插入失败")

#删:删除pid等于3的记录

sql = "Delete from " + table_name + " where pid = 3"
try:
    rs.execute(sql)
    conn.commit()
    print("删除成功")
except:
     print("删除失败")

#改:将pid等于2的记录的pid改为1

sql = "Update " + table_name + " set pid = 1 where pid = 2"
try:
    rs.execute(sql)
    conn.commit()
    print("修改成功")
except:
    print("修改失败")

#查:查询数据库中所有表名

sql = "Select name From sqlite_master where type = 'table'"
res = rs.execute(sql)
print(res.fetchall())

#查询表中所有记录

sql = "Select * from " + table_name
try:
    res = rs.execute(sql)
    print(res.fetchall())
except:
     print([])