python与数据库(与Mysql的常用操作)
Python链接MySQL数据库
步骤:
- 连接数据库
- 生成游标对象
- 执行SQL语句
- 关闭游标
- 关闭连接
- pymysql
- pymysql: 是封装了MySQL驱动的Python驱动,一个能使Python连接到MySQL的库
pymysql安装
pip install pymysql
查看版本
pip show pymysql
首先我们的pymysql数据库已安装,且已建好名为test的数据库,其中有名为student的表
import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1
user = 'root', # 用户名
passwd='password', # 密码
port= 3306, # 端口,默认为3306
db='test', # 数据库名称
charset='utf8'# 字符编码
)
cur = conn.cursor() # 生成游标对象
sql="select * from student " # SQL语句
cur.execute(sql) # 执行SQL语句
data = cur.fetchall() # 通过fetchall方法获得数据
for i in data[:2]: # 打印输出前2条数据
print (i)
cur.close() # 关闭游标
conn.close() # 关闭连接
上述代码中,实现了通过Python连接MySQL查询所有的数据,并输出前2条数据的功能。执行结果如下:
('a', '赵大', '16')
('b', '钱二', '16')
Python对MySql数据库实现增删改查
增
import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1
user = 'root', # 用户名
passwd='password', # 密码
port= 3306, # 端口,默认为3306
db='test', # 数据库名称
charset='utf8', # 字符编码
)
cur = conn.cursor() # 生成游标对象
#=插入语句===================
sql= “INSERT INTO student VALUES ('p','魏六','17')”
#===================================================
try:
cur.execute(sql1) # 执行插入的sql语句
conn.commit() # 提交到数据库执行
except:
coon.rollback()# 如果发生错误则回滚
conn.close() # 关闭数据库连接
删
import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1
user = 'root', # 用户名
passwd='password', # 密码
port= 3306, # 端口,默认为3306
db='test', # 数据库名称
charset='utf8', # 字符编码
)
cur = conn.cursor() # 生成游标对象
#=删除语句===================
sql = "DELETE FROM student WHERE 学号 = 'a'"
try:
cur.execute(sql) # 执行插入的sql语句
conn.commit() # 提交到数据库执行
except:
coon.rollback()# 如果发生错误则回滚
conn.close() # 关闭数据库连接
改
import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1
user = 'root', # 用户名
passwd='password', # 密码
port= 3306, # 端口,默认为3306
db='test', # 数据库名称
charset='utf8', # 字符编码
)
cur = conn.cursor() # 生成游标对象
#更新语句===================
sql ="UPDATE student SET 学员姓名 = '欧阳' WHERE 学号 = 'b'"
try:
cur.execute(sql) # 执行插入的sql语句
conn.commit() # 提交到数据库执行
except:
coon.rollback()# 如果发生错误则回滚
conn.close() # 关闭数据库连接
查
import mysql.connector
conn=mysql.connector.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1
user = 'root', # 用户名
passwd='password', # 密码
port= 3306, # 端口,默认为3306
db='test', # 数据库名称
charset='utf8', # 字符编码
)
cur = conn.cursor() # 生成游标对象
sql="select * from student " # SQL语句
cur.execute(sql) # 执行SQL语句
data = cur.fetchall() # 通过fetchall方法获得数据
for i in data[:]: # 打印输出所有数据
print (i)
cur.close() # 关闭游标
conn.close() # 关闭连接
执行结果就是:
('b', '钱二', '16')
('c', '张三', '17')
('d', '李四', '17')
('e', '王五', '16')
('a', '赵大', '16')
('p', '魏六', '17')
小型案例
import pymysql
config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'passwd': 'password',
'charset':'utf8',
}
conn = pymysql.connect(**config)
cursor = conn.cursor()
try:
创建数据库
DB_NAME = 'test_3'
cursor.execute('DROP DATABASE IF EXISTS %s', DB_NAME)
cursor.execute('CREATE DATABASE IF NOT EXISTS %s' , DB_NAME)
conn.select_db(DB_NAME)
#创建表
TABLE_NAME = 'bankData'
cursor.execute('CREATE TABLE %s(id int primary key,money int(30))', TABLE_NAME)
批量插入纪录
values = []
for i in range(20):
values.append((int(i),int(156*i)))
cursor.executemany('INSERT INTO bankData values(%s,%s)', values)
conn.commit()
查询数据条目
count = cursor.execute('SELECT * FROM %s', TABLE_NAME)
print ('total records:{}'.format(cursor.rowcount))
获取表名信息
desc = cursor.description
print ("%s %3s" % (desc[0][0], desc[1][0]))
cursor.scroll(10,mode=‘absolute’)
results = cursor.fetchall()
for result in results:
print (result)
except:
import traceback
traceback.print_exc()
# 发生错误时会滚
conn.rollback()
finally:
# 关闭游标连接
cursor.close()
# 关闭数据库连接
conn.close()
综合案例
银行转账系统
先建立数据库test_3和表bankdata
import pymysql
config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'passwd': 'password',
'charset':'utf8',
}
conn = pymysql.connect(**config)
cursor = conn.cursor()
try:
创建数据库
DB_NAME = 'test_3'
cursor.execute('DROP DATABASE IF EXISTS %s', DB_NAME)
cursor.execute('CREATE DATABASE IF NOT EXISTS %s', DB_NAME)
conn.select_db(DB_NAME)
#创建表
TABLE_NAME = 'bankData'
cursor.execute('CREATE TABLE %s(id int primary key,money int(30))', TABLE_NAME)
批量插入纪录
values = []
for i in range(20):
values.append((int(i),int(156*i)))
cursor.executemany('INSERT INTO bankData values(%s,%s)', values)
conn.commit()
查询数据条目
count = cursor.execute('SELECT * FROM %s', TABLE_NAME)
print ('total records:{}'.format(cursor.rowcount))
获取表名信息
desc = cursor.description
print ('%s %3s' % (desc[0][0], desc[1][0]))
cursor.scroll(10,mode=‘absolute’)
results = cursor.fetchall()
for result in results:
print (result)
except:
import traceback
traceback.print_exc()
# 发生错误时会滚
conn.rollback()
finally:
# 关闭游标连接
cursor.close()
# 关闭数据库连接
conn.close()
构建系统
import pymysql
class TransferMoney(object):
构造方法
def init(self, conn):
self.conn = conn
self.cur = conn.cursor()
def transfer(self, source_id, target_id, money):
if not self.check_account_avaialbe(source_id):
raise Exception('账户不存在')
if not self.check_account_avaialbe(target_id):
raise Exception('账户不存在')
if self.has_enough_money(source_id, money):
try:
self.reduce_money(source_id, money)
self.add_money(target_id, money)
except Exception as e:
print('转账失败:', e)
self.conn.rollback()
else:
self.conn.commit()
print('%s给%s转账%s金额成功' %(source_id, target_id, money))
def check_account_avaialbe(self, acc_id):
# 判断帐号是否存在, 传递的参数是银行卡号的id
select_sqli = 'select * from bankData where id=%d;' % (acc_id)
print('execute sql:', select_sqli)
res_count = self.cur.execute(select_sqli)
if res_count == 1:
return True
else:
raise Exception('账户%s不存在' % (acc_id))
return False
def has_enough_money(self, acc_id, money):
# 判断acc_id账户上金额> money
# 查找acc_id存储金额?
select_sqli = 'select money from bankData where id=%d;' % (acc_id)
print('execute sql:', select_sqli)
self.cur.execute(select_sqli) # ((1, 500), )
# 获取查询到的金额钱数;
acc_money = self.cur.fetchone()[0]
# 判断
if acc_money >= money:
return True
else:
return False
def add_money(self, acc_id, money):
update_sqli = 'update bankData set money=money+%d where id=%d' % (money, acc_id)
print('add money:', update_sqli)
self.cur.execute(update_sqli)
def reduce_money(self, acc_id, money):
update_sqli = 'update bankData set money=money-%d where id=%d' % (money, acc_id)
print('reduce money:', update_sqli)
self.cur.execute(update_sqli)
析构方法
def del(self):
self.cur.close()
self.conn.close()
if name == 'main':
# 1. 连接数据库,
conn = pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1
user = 'root', # 用户名
passwd='password', # 密码
port= 3306, # 端口,默认为3306
db='test_3', # 数据库名称
charset='utf8',
autocommit=True, # 如果插入数据,自动提交给数据库
)
trans = TransferMoney(conn)
trans.transfer(15, 12, 200)

浙公网安备 33010602011771号