环境: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()

执行结果:

Python&MySQL的更多相关文章

  1. 【初学python】使用python连接mysql数据查询结果并显示

    因为测试工作经常需要与后台数据库进行数据比较和统计,所以采用python编写连接数据库脚本方便测试,提高工作效率,脚本如下(python连接mysql需要引入第三方库MySQLdb,百度下载安装) # ...

  2. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  3. 使用 python 管理 mysql 开发工具箱 - 1

    Mysql 是一个比较优秀的开源的数据库,很多公司都在使用.作为运维人员,经常做着一些重复性的工作,比如创建数据库实例,数据库备份等,完全都可以使用 python 编写一个工具来实现. 一.模块 Co ...

  4. 练习:python 操作Mysql 实现登录验证 用户权限管理

    python 操作Mysql 实现登录验证 用户权限管理

  5. Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  6. Python操作Mysql数据库时SQL语句的格式问题

    一.概述 近日使用Python对Mysql数据库进行操作,遇到SQL语句死活出问题的情况.由于最初没有将异常打印出来,一直不知道原因.随后,将异常打印出来之后,通过异常信息,对代码进行修改.最终,成功 ...

  7. Python操作Mysql之基本操作

    pymysql python操作mysql依赖pymysql这个模块 下载安装 pip3 install pymysql 操作mysql python操作mysql的时候,是通过”游标”来进行操作的. ...

  8. python对Mysql操作和使用ORM框架(SQLAlchemy)

    python对mysql的操作 Mysql 常见操作 数据库操作 创建数据库 create database fuzjtest 删除数据库 drop database fuzjtest 查询数据库 s ...

  9. python操作mysql总结

    Windows系统,python环境搭建. 下载并安装python2.7.11 https://www.python.org/downloads/ 下载并安装python的mysql包: http:/ ...

  10. python使用mysql数据库

    一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的l ...

随机推荐

  1. 微信服务号获取openId流程(订阅号)

    微信公众平台官网:https://mp.weixin.qq.com/ 微信测试开发平台官网:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandb ...

  2. 华硕(ASUS)X554LP笔记本重装win7后网卡和USB驱动问题的解决

    以前在其它笔记本上采用U盘克隆安装winxp系统非常顺利,各种硬件驱动能自动识别并安装. 手上有一台别人的华硕(ASUS)X554LP笔记本,原装win8.1,用不惯,想装个win7旗舰版. 照例去系 ...

  3. python学习笔记(6)——for...in &while

    for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句. 注意:python中的格式也起到语法规则的作用,缩进块就是一个例 求和问题,比较异同 1/sum= ,,,,,,,,,]: ...

  4. javascript按钮点击事件问题

    今天弄了个小测试,结果发现了点问题. 就是有一个按钮的点击事件,页面加载时候没反应,只有F12启用开发人员工具的时候才有反应.后来反复测试发现名字起的不太合理 function onclick(){ ...

  5. Spring框架系列(六)--事务Transaction

    本文绝大部分内容为转载,原文地址:https://blog.csdn.net/trigl/article/details/50968079 除此之外,后面还有延伸内容 事务在企业日常开发中几乎是一定会 ...

  6. bazel和TensorFlow安装

    bazel安装:https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu 安 ...

  7. Calendar的用法

    DAY_OF_MONTH的主要作用是cal.get(DAY_OF_MONTH),用来获得这一天在是这个月的第多少天 Calendar.DAY_OF_YEAR的主要作用是cal.get(DAY_OF_Y ...

  8. JAVA基础——链表结构之双端链表

    双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用 如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双 ...

  9. P1541 乌龟棋 题解(洛谷,动态规划递推)

    题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ...

  10. NFS文件服务

    安装NFS服务 Yum install nfs-utils –y 2.关闭防火墙 service iptables stop 3./etc/exports NFS服务配置文件 /home/share ...