版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37579123/article/details/85218054
python连接数据库总结
1.连接oracle数据库
a.下载并安装64bit的Oracle和PLSQL,下载地址:
链接: https://pan.baidu.com/s/16DISSETVPvmsjjHJoK7K4A 提取码: r6rk
b.下载cx_Oracle: py -3 -m pip install cx_Oracle
import cx_Oracle
db=cx_Oracle.connect('sms/123test@localhost/ora11g') #连接oracle数据库
cursor = db.cursor () #创建游标cursor
cursor.execute ("select * from sms_captcha") #执行sql语句
cursor.fetchone() #获取一条记录,可通过死循环,直到获取的结果为空为止
#row = cursor.fetchone ()
cursor.fetchall() #获取所有查询结果,然后再一行一行的迭代
rows=cursor.fetchall()
for row in rows:
print (row[5])
cursor.execute("update sms_captcha s set s.captcha_code='123456' where s.id='123456'")
db.commit() #更新数据库操作,提交事务
cursor.close() #关闭游标
db.close () #关闭数据库连接
2.连接mysql数据库
a.下载地址:https://dev.mysql.com/downloads/windows/installer/ 安装和配置环境变量(自行百度)
b.安装完成后:进入cmd窗口运行mysql -uroot -p,输入设置的密码即可进入本地mysql;退出mysql:ctrl+z+回车,或者exit
c.操作流程:
1.下载pymysql:py -3 -m pip install pymysql
2.连接数据库,获取游标
3.执行增删改查sql语句,提交事务;
4.关闭数据库连接
3.具体操作(以mysql为例,oracle操作同理)
(1)连接数据库,获取操作游标
#encoding:utf-8
import pymysql
# 打开数据库连接
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd",
db = "test",
charset = "utf8")
# 使用cursor()方法获取数据库的操作游标
cursor = conn.cursor()
print(cursor)
print(type(cursor))
(2)新建数据库
import pymysql
#增加处理异常操作
try:
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd"
)
cur = conn.cursor()
cur.execute('CREATE DATABASE IF NOT EXISTS pythondb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;') #后缀ci:大小写不敏感 cs:大小写敏感
except pymysql.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
finally:
cur.close()
conn.close()
(3)新建表结构
import pymysql
try:
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd"
)
conn.select_db('pythondb') #选择pythonDB数据库
cur = conn.cursor() #获取游标
cur.execute("drop table if exists User;") #如果所建表已存在,删除重建
cur.execute('''CREATE TABLE `User`(
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`birthday` date DEFAULT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8;''') #执行建表sql语句
except pymysql.Error as e:
print("Mysql Error %d: %s" %(e.args[0], e.args[1]))
finally:
cur.close()
conn.close()
(4)添加单条数据
#coding=utf-8
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
# 插入一条数据, cursor.execute()插入成功后,返回插入成功数据的条数,并赋值给insert
insert = cursor.execute("insert into user values(1,'Tom','123','1990-01-01')")
print(u"添加语句受影响的行数:", insert) #insert 为int类型
# 另一种插入数据方法,通过格式字符串传入值,此方式可以防止sql注入(推荐此方法)
sql = "insert into user values(%s, %s, %s, %s)"
insert = cursor.execute(sql, (3,'lucy','efg','1993-02-01'))
print(u"添加语句受影响的行数:", insert)
cursor.close()
conn.commit() # 提交事务
conn.close()
print(u"sql语句执行成功!")
(5)添加多条数据
#coding=utf-8
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
sql = "insert into user values(%s, %s, %s, %s)"
j=0
for i in range(100,201):
cursor.execute(sql, (i,'lucy'+str(i),'efg'+str(i),str(1900+j)+'-02-01'))
j+=1
print(u"添加语句受影响的行数:", j)
cursor.close()
conn.commit()
conn.close()
(6)随机生成数据
#coding=utf-8
import pymysql
import random
import time
def now():
return time.strftime("%Y-%m-%d")
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
for i in range(10,20):
sql = "insert into user values(%s, %s, %s, %s)"
cursor.execute(sql, (random.randint(1,10000),'lucy'+str(random.randint(1,10000)),'efg'+str(random.randint(1,10000)),now()))
cursor.close()
conn.commit()
conn.close()
(7)从数据库中取值,每次取一条,取出来的值是元组类型
#coding=utf-8
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
cursor.execute("select * from user")
while True:
res = cursor.fetchone()
if res is None: #表示已经取完结果集
break
print(res)
print(res[-1].strftime("%Y-%m-%d")) #将读取到的时间格式化
cursor.close()
conn.close()
(8)从数据库中取值,指定数量/全部数量
#coding=utf-8
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
cursor.execute("select * from user")
resTuple = cursor.fetchmany(2) # 获取游标处两条数据
#resTuple = cursor.fetchall() 取所有的数据
print("结果集类型:", type(resTuple))
for i in resTuple:
print(i)
cursor.close()
conn.close()
(9)更新一条数据
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
update = cursor.execute("update user set password = 'Tom_test' where name='lucy5234'")
print("修改语句受影响的行数:", update)
cursor.execute("select * from user where name='lucy5234';")
print(cursor.fetchone()) #此时查询字段值还没更新,因为未提交事务
cursor.close()
conn.commit() # 提交事务
conn.close()
(10)批量更新数据
#coding=utf-8
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
query = cursor.execute("select * from user") #返回数据的数量,为int类型
print("表中所有数据:")
for i in cursor.fetchall():
print(i)
cursor.executemany("update user set password = %s where name=%s",
[('tomx2x','lucy5231'),('Tomx2x', 'lucy5965')]) #批量更新数据,注意后面是列表类型
cursor.close()
conn.commit()
conn.close()
(11)删除一条数据
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
query=cursor.execute("select * from user")
print (“删除前的数据个数”,query)
print("表中所有数据:")
for i in cursor.fetchall():
print(i)
delete = cursor.execute("delete from user where name='lucy5905'") # 删除数据
print("删除语句影响的行数:", delete)
conn.commit()
query=cursor.execute("select * from user")
print (“删除后的数据个数”,query)
for i in cursor.fetchall():
print(i)
cursor.close()
conn.close()
(12)批量删除数据
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
query=cursor.execute("select * from user")
print ("删除前的数据个数",query)
print("表中所有数据:")
for i in cursor.fetchall():
print(i)
delete = cursor.executemany("delete from user where name=%s", [('amy',), ('lily',)]) #批量删除数据
conn.commit()
print("删除语句影响的行数:", delete)
query=cursor.execute("select * from user")
print ("删除后的数据个数",query)
for i in cursor.fetchall():
print(i)
cursor.close()
conn.close()
(13)事务回滚:一定要在commit()之前执行,否则commit()后数据已经更新,操作回滚不会生效
#coding=utf-8
import pymysql
conn = pymysql.connect(
host = "127.0.0.1",
port = 3306,
user = "testuser",
passwd = "testpasswd" ,
db = "pythondb",
charset = "utf8")
cursor = conn.cursor()
cursor.execute("select * from user")
datas = cursor.fetchall()
print("修改前的数据:\n", datas[0])
cursor.execute("update user set birthday='2100-08-12' where name='lucy5234'") # 更新数据表中第一条数据
conn.rollback() # 回滚事务
cursor.execute("select * from user")
datas = cursor.fetchall()
print("事务回滚后的数据:\n", datas[0])
cursor.close()
conn.commit()
conn.close()