首页 > 数据库频道-数据库维护 > MYSQL数据库 > 正文
Python&MySQL
2016-04-13     我来说两句       作者:黑帽网
   我要投稿
环境:windows8+Python2.7+MySQL5.6
//
尝试过在C/C++中嵌入SQL语言,终于在其复杂“繁琐”环境配置中败下阵来,后来发现Python和MySQL比较容易实现,在Python中可以导入MySQLdb包,调用已经封装好的API接口,就能在Python中嵌入SQL语句,实现对的操作;
调用MySQLdb库函数,首先建立和mysql数据库连接connection,定义一个游标cursor,就能向DBMS传输一条条SQL语句,交给DBMS执行,随后通过API将检索结果返回,由cursor指针指向;在Python中,只需要通过cursor这个指针调用fetchall或者fetchone方法对检索结果结合进行访问;除了检索,cursor还可以完成很多操作,例如:新建(视图,表,数据库等),增删改,访问数据字典(描述表格模式,显示数据库,表格等);之后提交MySQL或者rollback,提交数据或者撤销对数据库的操作;

MySQL除了繁琐的命令行操作界面外,现在有很多的人性化的可视化界面操作,我使用的是navicat
/
1.导入MySQLdb包
在控制台中键入 import MySQLdb,如果没有错误提示,则说明可以成功导入MySQLdb
/

2.连接和断开数据库
conn = MySQLdb.connect(#建立一个连接,命名为conn    host ='localhost',#主机    user ='root',#本地用户    passwd ='',#密码    db ='_test_db',#连接数据库名    )conn.close()

3.定义游标cursor以及关闭游标
cur = conn.cursor()cur.close()
注:当然游标可以定义多个

4.游标常用方法,以检索为例:
sql = "select * from students"cur.execute(sql)print cur.fetchall()
sql中存放的符合MySQL语法规则的SQL语句,cur调用execut方法,将SQL语句传给DBMS执行,返回值用cur指向;
fetchall()方法获取所有行,fetchone()方法获取一行,fetchmany(int i)方法获取多行(i行);
具体返回多少行可以由count = cur.execute(sql)来记录;
打印结果:
/
发现打印似乎有问题,解决方法在后面给出;

5.简单的SQL命令罗列:
建库:create database database_name;
建表:create table table_name(
属性名 数据类型[其他描述],
...);
删库:drop database database_name;
删表: drop table table_name;
查询表格模式:describe table_name;
插入:insert into table_name(column_name,...) values(...);
查询:select *|column_name,... from table_name where condition;
更新:update table_name set column_name=... where condition;
删除:delete from table_name where condition;
修改:alter table table_name [add|modify|drop unique];
除了以上操作外还有:
show databases;
use database_name;
close database_name;
show tables;
describe table_name;
注意:delete from table_name只是删除了表中的数据,表格的模式还在;

6.事务提交
为了保证数据库操作的原子性(若干的SQL操作组成一个事务,比如类转账操作,必须一个账户减额,另外一个账户增额,这样才能正常运营下去;又比如同时间同出发终止地点同辆火车会不会买到相同的座位问题)并发性控制,所以在每个事务操作完成后,对其进行错误检测,是否应该提交还是撤销操作;
分别为conn.commit()和conn.rollback();

7.错误检测:
待深入,可以使用错误捕获机制try...except...;;

8.可能使用到字符串传参问题:
sql="select aid,sum(dollars) from orders where cid=%s group byaid"cur.execute(sql,[agent])
比如需要根据输入的agent值,构成完整的SQL语句,当然还可以是多个参数:
cur.execute(sql,[s1,s2,...])

9.输出编码问题:
print cur.fetchall()
或者
print cur.fetchone()
这样获得的全部记录或者是一条记录,相当于元组,这样直接打印,输出的是MySQL的字符编码,上面例子显示的utf8编码,那怎么才能显示正常呢?
逐一打印其中的每一个分量:
贴上打印函数:
def connect_width(text, width):    stext =text    iftype(text)==int or type(text)==long:#如果是数字型需要转为字符型       stext = str(text)    return"%-*s"%(width,stext)   def Print_MySqldb_Result(cur):   str_result="| "   row1=""   array_lenth=[]    iflen(cur.fetchall())==0:       print "cur is null,check your sql select"    else:       for field_desc in cur.description:           if len(field_desc[0])>field_desc[2]:               array_lenth.append(len(field_desc[0]))           else:               array_lenth.append(field_desc[2])           text=connect_width(field_desc[0],field_desc[2])           str_result=str_result+text+" |"       lenth=len(str_result)       for i in range(lenth):           if i==0:               row1=row1+"+"           else:               if i==lenth-1:                   row1=row1+"+"               else:                   row1=row1+"-"       print row1       print str_result       print row1       for i in cur:           row2="| "           k=0           for j in i:               text=connect_width(j,array_lenth[k])               row2=row2+text+" |"               k=k+1           print row2       print row1
格式化打印效果:
/
如果显示中文有问题,或者格式化输出中英文结合有问题,可以继续去查找相应的方法解决,
主要是解决中文字宽的问题,这里不给出;

10.Python编码和MySQL编码问题:
show variables like 'char%'
显示结果:
/
默认的编码为Latin1,这样需要去MySQL的根目录修改my.ini文件中修改:
default-character-set=utf8
init_connect='SET NAMES utf8'
添加上这两行,即可

附上完整地Python代码
importMySQLdb      def connect_width(text, width):    stext =text    iftype(text)==int or type(text)==long:#如果是数字型需要转为字符型       stext = str(text)    return"%-*s"%(width,stext)   def Print_MySqldb_Result(cur):   str_result="| "   row1=""   array_lenth=[]    iflen(cur.fetchall())==0:       print "cur is null,check your sql select"    else:       for field_desc in cur.description:           if len(field_desc[0])>field_desc[2]:               array_lenth.append(len(field_desc[0]))           else:               array_lenth.append(field_desc[2])           text=connect_width(field_desc[0],field_desc[2])           str_result=str_result+text+" |"       lenth=len(str_result)       for i in range(lenth):           if i==0:               row1=row1+"+"           else:               if i==lenth-1:                   row1=row1+"+"               else:                   row1=row1+"-"       print row1       print str_result       print row1       for i in cur:           row2="| "           k=0           for j in i:               text=connect_width(j,array_lenth[k])               row2=row2+text+" |"               k=k+1           print row2       print row1       #print "print ok"       conn=MySQLdb.connect(   host='localhost',   user='root',   passwd='',   db='mysql_test_db',    #   charset='utf8',    )cur=conn.cursor()while 1:    agent =input("Please input cid,input 1 to exit:/n")    ifagent==1:       break    else:       #agent = "C1"       sql="select aid,sum(dollars) from orders where cid=%s group byaid"       cur.execute(sql,[agent])       print "agent_dollars with cid='%s'"%agent       Print_MySqldb_Result(cur)#print('run ok')conn.commit()cur.close()conn.close()
运行结果:
/

点击收藏到自己的收藏夹!回本站首页
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:windows7下安装mysql-5.7.11-win32
下一篇:Python&MySQL&PyQt
相关文章
图文推荐
排行
热门
oracle
Sysbase
其他
关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 中国黑帽网--致力于做最好的网络安全技术学习网站 。