往mysql写数据一段时间了,但一直没写篇博客记录,所以今日特地补上一篇。
(以下操作的前提是你已配好了python环境及安装了mysql数据库)
python版本: 2.7
模块安装: pip install pymysql
前言:考虑到现在python3.x已经不支持MySQLdb了,所以本次采用pymysql讲解,使用python3.x的看官改下语法就行。
首先,说下操作步骤。
1.建个测试表,表名为test,如下图所示(找个mysql的可视化软件,操作方便些,如 Navicat for MySQL)
2.敲代码...
步骤说完,接下来...啥?这就完了?对,就是这么简单。
接下来说说新手要注意的‘坑’,这才是重头戏!
1)表中中文老是显示乱码怎么办?别慌,看下图->
2)增删改查都试了,数据还是没变化,这....
少年,你的 xx.commit()掉了,切记,不提交都是徒劳。
3)往表中插入多条数据,好好的中文怎么就变成了'\x23\2423\123\...'这是什么鬼...
莫怕,你可以这样写:
sql = 'insert into test values(' +str(ids[i]) + ',"' + names[i] + '",' + str(ages[i]) + ',"' + sex[i] + '"'')'
额...,这一堆的单引号、双引号是个什么玩意?才两个字符串就这样,多了还不直接晕掉?换个行不行?
当然可以!
其实你可以这样写: sql = 'insert into test values({},"{}",{},"{}")'.format(ids[i], names[i], ages[i], sexs[i])
注: {}相当于一个容器,放整数、小数、字符串都行,不过放字符串的时候要加上"",变成这样->"{}"
或者这样写: sql = 'insert into test values(%d,"%s",%d,"%s")' % (ids[i], names[i], ages[i], sexs[i])
注:%d表示整型,%s表示字符串,放字符串的地方也要加"",即变成 "%s"
4)查询得到结果集后,用fetchone()得到一条数据,然后迫不及待地打印输出,结果....
我的中文又没了...
同学,请'脚踏实地'的循环输出...
到此,大坑就基本说完了,下面直接上'菜',各位慢慢品尝...
# coding=UTF-8
import pymysql
#插入数据
def testInsert(Cursor):
try:
# test后无具体字段,表示添加全部字段,等价于test(id,name,age,sex),()中为全部字段名
# sql = 'insert into test values(2,"小明",19,"男")' #添加单条记录
# 非添加所有字段时,要将所有添加字段名写上
#sql = 'insert into test(id,name,age) values(3,"小虎",17)'
# 添加多条记录方法
ids = [1, 2, 3, 4]
names = ['小白', '小黄', '小花', '小草']
ages = [12, 13, 14, 15]
sexs = ['男', '男', '女', '女']
for i in range(4):
# sql = 'insert into test values(' + str(ids[i]) + ',"' + names[i] + '",' + str(ages[i]) + ',"' + sexs[i] + '"'')'
# sql = 'insert into test values({},"{}",{},"{}")'.format(ids[i], names[i], ages[i], sexs[i])
sql = 'insert into test values(%d,"%s",%d,"%s")' % (ids[i], names[i], ages[i], sexs[i])
print sql
Cursor.execute(sql)
print '添加成功'
except Exception, e:
print '添加失败', e
#删除数据
def testDelete(Cursor, id):
try:
# sql = 'delete from test where id=4' #给定id具体值
sql = 'delete from test where id =%d' % id # id值由外面传入
Cursor.execute(sql)
print '删除成功'
except Exception, e:
print '发生异常:', e
#修改数据
def testUpdate(Cursor, name, id):
try:
sql = 'update test set name="更改",age=3,sex="未知" where id=2' # 直接给值
sql = 'update test set name="{}" where id={}'.format(name, id) # 由外部传值
Cursor.execute(sql)
print '修改成功'
except Exception, e:
print '发生异常:', e
#查询数据
def testSelect(cursor, id):
try:
# sql = 'select * from test where id=2' # 查询单条记录,直接给值
# sql = 'select * from test where id=%d' % id # 查询单条记录,外部传值
sql = 'select * from test' # 查询所有记录
cursor.execute(sql)
# data = cursor.fetchone() # 从结果集中取得单条数据
# print type(data) # 验证返回类型
# for d in data:
# print d,
data = cursor.fetchall() # 获取结果集的所有数据
print type(data) # 验证返回类型
for r in data: # 先取得每条记录的元组对象
for d in r:
print d,
print
# 在con.cursor()中加上参数 MySQLdb.cursors.DictCursor后,查询返回一个字典对象,可通过字段名取值
# data = cursor.fetchall()
# print type(data) # 验证返回类型
# print '按字段名取值测试成功:'
# for d in data:
# print 'id:', d['id'], 'name:', d['name'], 'age:', d['age'], 'sex:',d['sex']
except Exception, e:
print '发生异常:', e
#获取记录数
def testCounts(cursor):
try:
sql = 'select count(*) from test'
cursor.execute(sql)
length = cursor.fetchone()
print'共有:', length[0], '条记录'
except Exception, e:
print '发生异常', e
if __name__ == '__main__':
try:
con = pymysql.connect('localhost', '你的mysql用户名', '密码', '要连接的数据库', charset='utf8')
# 加入编码,防止表中乱码,切记,是 utf8 !!!不是utf-8!
cursor = con.cursor() #创建操作游标,无参数时查询方法返回一个元组对象
# cursor = con.cursor(MySQLdb.cursors.DictCursor) # 加上该参数后,查询方法返回一个字典对象
# testInsert(cursor) # 测试插入方法
# testDelete(cursor, 1) # 测试删除方法
# testUpdate(cursor, '我又改名了', 2) # 测试修改方法
testSelect(cursor, 2) # 测试查询方法
testCounts(cursor) # 测试获取记录数方法
con.commit() # 记得提交,不然没有效果
except Exception, e:
print '连接数据库失败', e
con.rollback() # 错误时回滚
finally:
cursor.close()
con.close() # 关闭数据库连接
运行图就放这两张做代表了,有兴趣的可以粘贴下来慢慢‘玩’。不过连接那里记得改哈