Python&MySQL

环境:windows8+Python2.7+MySQL5.6

尝试过在C/C++中嵌入SQL语言,最终在其复杂“繁琐”环境配置中败下阵来,后来发现Python和MySQL比較easy实现,在Python中能够导入MySQLdb包。调用已经封装好的API接口,就能在Python中嵌入SQL语句。实现对数据库的操作;
Python调用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 ='',#password
    db ='mysql_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()
执行结果:


posted @ 2017-07-05 21:45  lytwajue  阅读(202)  评论(0编辑  收藏  举报