环境: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. WordPress极简主题Small Cat详细介绍

    主题特性: HTML5.CSS3 使用标准语言编写,支持IE10以上浏览器 响应式 在桌面.平板.手机端均以最佳状态显示.也可分享到微信显示哦! 自定义 超过60多个后台自定义设置,让你的站点与众不同 ...

  2. Python :用两个栈实现队列

    转自:http://blog.csdn.net/Lynette_bb/article/details/75092745 牛客网上的剑指 offer的在线编程: 题目描述 用两个栈来实现一个队列,完成队 ...

  3. taskctl命令行类(sh、exe、python新增scp)插件升级扩展

    转载自: http://www.taskctl.com/forum/detail_129.html 上次写了一个帖子 TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)h ...

  4. Oracle+struts2实现用户登入并显示访问次数

    实体类: package entity; public class userfo { private int id;//id private String name;//用户名 private Str ...

  5. golang 自定义time.Time json输出格式

    工作中使用golang时,遇到了一个问题.声明的struct含time.Time类型.使用json格式化struct时,time.Time被格式化成”2006-01-02T15:04:05.99999 ...

  6. swift 工作日志

    开发问题汇总: tableview.register(CEImpWalletHomeCell.self, forCellReuseIdentifier: "cell") var c ...

  7. SpringBoot开源项目学习总结

    一.实现日期格式数据类型的转换 首先,定义DateConverter实现Converter<String, Date>接口: package com.stevlu.common; impo ...

  8. Eclipse报错:Setting property 'source' to 'org.eclipse.jst.jee.server:xx' did not find a matching property

    Shell代码   警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to ' ...

  9. php第二十四节课

    三级联动 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  10. JQuery 的toggle() 方法如何使用?

    JQuery中的toggle()方法,相当于点一个元素时,重复循环两个函数,而这两个函数可以作为toggle()函数的两个参数传进去,当第一次点击的时候会执行前面的参数,而第二次点击时执行的是后面的参 ...