1、和数据库建立连接
2、执行sql语句,接收返回值
3、关闭数据库连接
1、MySQL数据库要用MySQLdb模块,但Python用来链接MySQL的第三方库MySQLdb不支持Python3x
特别说明:我在我的电脑上实验时,我的python是272版本,安装对应版本的MySQLdb之后直接可以运行,并与数据库连接成功,所以如果大家也像我一样顺利的话,下面的就不需要看了,直接跳过,看第2点如何执行sql语句即可!如果安装之后出现异常,可以参考一下下面的解决办法。
连接的关键是安装MySQLdb模块要下载与Python相对应的版本:
下载好后安装,它会自动检测到计算机Python的安装路径,并自动填写模块解压路径(我的是:D:\ProgramFiles\ActivePython 26617\Lib\site-packages\)。
但解压完成后并不能使用,还要修改MySQLdb模块下的一些文件:
①在MySQLdb目录下(我的是:D:\ProgramFiles\ActivePython 26617\Lib\site-packages\MySQLdb)找到__init__py:
注释第34、35行的from setsimport ImmutableSet、class DBAPISet(ImmutableSet):,在后面添加class DBAPISet(frozenset):
# from sets import ImmutableSet
# class DBAPISet(ImmutableSet):
class DBAPISet(frozenset):
②打开converterspy:
注释第37行的from sets import BaseSet, Set,将第45行的return Set([ i for i in ssplit(',') ifi ])中的Set改为set;同样将第129行的Set: Set2Str,中的Set改为set(不要修改Set2Str),到这里就修改完毕了
2建立数据库连接
import MySQLdb
conn=MySQLdbconnect(host="localhost",user="root",passwd="sa",db="mytable")
比较常用的参数包括
host: 连接的数据库服务器主机名,默认为本地主机(localhost)。
user:数据库登陆名默认是当前用户
passwd:数据库登陆的秘密默认为空
db:要使用的数据库名没有默认值
port:MySQL服务使用的TCP端口默认是3306
conn连接有两个重要的方法commit提交新增和修改,rollback撤销新增或修改
3、执行数据库 *** 作
n=cursorexecute(sql,param)
我们要使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作
这些方法包括两大类:1执行命令,2接收返回值
cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集
cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行
fetchmany(self, size=None):接收size条返回结果行如果size的值大于返回的结果行的数量,则会返回cursorarraysize条数据
fetchone(self):返回一条结果行
scroll(self, value, mode='relative'):移动指针到某一行如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条
下面的代码是一个完整的例子
#使用sql语句,这里要接收的参数都用%s占位符要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s
sql="insert into cdinfo values(%s,%s,%s,%s,%s)"
#param应该为tuple或者list
param=(title,singer,imgurl,url,alpha)
#执行,如果成功,n的值为1
n=cursorexecute(sql,param)
#再来执行一个查询的 *** 作
cursorexecute("select from cdinfo")
#我们使用了fetchall这个方法这样,cds里保存的将会是查询返回的全部结果每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple
cds=cursorfetchall()
#因为是tuple,所以可以这样使用结果集
print cds[0][3]
#或者直接显示出来,看看结果集的真实样子
print cds
#如果需要批量的插入数据,就这样做
sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)"
#每个值的集合为一个tuple,整个参数集组成一个tuple,或者list
param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))
#使用executemany方法来批量的插入数据这真是一个很酷的方法!
n=cursorexecutemany(sql,param)
需要注意的是(或者说是我感到奇怪的是),在执行完插入或删除或修改 *** 作后,需要调用一下conncommit()方法进行提交这样,数据才会真正保存在数据库中我不清楚是否是我的mysql设置问题,总之,今天我在一开始使用的时候,如果不用commit,那数据就不会保留在数据库中,但是,数据确实在数据库呆过因为自动编号进行了累积,而且返回的受影响的行数并不为0
4、关闭数据库连接
需要分别的关闭指针对象和连接对象他们有名字相同的方法
cursorclose()
connclose()
5、
5 编码(防止乱码)
需要注意的点:
1 Python文件设置编码 utf-8 (文件前面加上 #encoding=utf-8)
2 MySQL数据库charset=utf-8
3 Python连接MySQL是加上参数 charset=utf8
4 设置Python的默认编码为 utf-8 (syssetdefaultencoding(utf-8)
#encoding=utf-8
import sys
import MySQLdb
reload(sys)
syssetdefaultencoding('utf-8')
db=MySQLdbconnect(user='root',charset='utf8')
注:MySQL的配置文件设置也必须配置成utf8
6模块功能演示
#!/usr/bin/python
import MySQLdb
Con= MySQLdbconnect(host='localhost',user='root',passwd='root',db='abc')
cursor =concursor()
sql ="select from myt"
cursorexecute(sql)
row=cursorfetchone()
print row
cursorclose()
conclose()
执行以下SQL语句获取返回值:
//获取连接的游标
cursor=conncursor()
//查询
sql = "select from table"
//新增
sql = "insert into table(字段,字段) values(值,值)"
//修改
sql = "update table set 字段 =‘值’where 条件 "
//删除
sql = "delete from tablewhere 条件"
cursorexecute(sql)
返回值
curexecute('select from tables')
其返回值为SQL语句得到的行数,如:2L,表示2行。
然后,可以从该对象的fetchone或fetchall方法得到行信息。
获取行信息
指针对象的fetchone()方法,是每次得到一行的tuple返回值:
引用
>>> row=curfetchone()
>>> print row
('user1', '52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L, '/home/FTP/user1','')
指针对象的fetchall()方法,可取出指针结果集中的所有行,返回的结果集一个元组(tuples):
引用
>>> curscroll(0,'absolute')
>>> row=curfetchall()
>>> print row
(('user1', '52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L, '/home/FTP/user1',''), ('user2', '7e58d63b60197ceb55a1c487989a3720', 1000L, 1000L,'/home/FTP/user2', None))
移动指针
当使用fetchone()方法是,指针是会发生移动的。所以,若不重置指针,那么使用fetchall的信息将只会包含指针后面的行内容。
手动移动指针使用:
curscroll(int,parm)
含义为:
引用
int:移动的行数,整数;在相对模式下,正数向下移动,负值表示向上移动。
parm:移动的模式,默认是relative,相对模式;可接受absoulte,绝对模式。
修改数据
修改数据,包括插入、更新、删除。它们都是使用指针对象的execute()方法执行:
curexecute("insert into table (row1, row2) values ('111', '222')")
curexecute("update table set row1 = 'test' where row2 = 'row2' ")
curexecute("delete from table where row1 = 'row1' ")
因单引号“'”用于SQL语句中的标识,所以,python中的字符串需使用双引号括住。
此外,也可以使用python的“格式化字符串”写法,简化命令,例如:
curexecute("update table set row1 = '%s' where row2 = '%s' "%('value1','value2'))
※请注意,'%s'的单引号是SQL语句的间隔符,'value1'的单引号是python的字符串间隔符,其含义是不同的。是否需要间隔符,以及使用双引号还是单引号作为间隔,需根据其含义决定。例如,还有:
curexecute("update FTPUSERS set passwd=%s where userid='%s' "%("md5('123')",'user2'))
这里,paswd=%s是因SQL的md5()函数是不需要单引号间隔的;"md5('123')"是python的字符串中含有单引号,所以用双引号括住。
提交修改
一般情况下,MySQLdb模块会自动提交修改。但我们在更新数据后,手动运行一次:
conncommit()
关闭数据库连接
需要分别的关闭指针对象和连接对象他们有名字相同的方法
cursorclose()
connclose()
在 Python 语言环境下我们这样连接数据库。
In [1]: from mysql import connector
In [2]: cnx = connectorconnect(host="17216192100",port=3306,user="appuser",password="xxxxxx")
但是连接数据库的背后发生了什么呢?
答案
当我们通过驱动程序(mysql-connector-python,pymysql)连接 MySQL 服务端的时候,就是把连接参数传递给驱动程序,驱动程序再根据参数会发起到 MySQL 服务端的 TCP 连接。当 TCP 连接建立之后驱动程序与服务端之间会按特定的格式和次序交换数据包,数据包的格式和发送次序由 MySQL 协议 规定。MySQL 协议:>
MySQL 服务端向客户端发送一个握手包,包里记录了 MySQL-Server 的版本,默认的授权插件,密码盐值(auth-data)。
2 MySQL 客户端发出 ssl 连接请求包(如果有必要的话)。
3 MySQL 客户端发出握手包的响应包,这个包时记录了用户名,密码加密后的串,客户端属性,等等其它信息。
4 MySQL 服务端发出响应包,这个包里记录了登录是否成功,如果没有成功也会给出错误信息。
1、python安装目录设定为d:/python34
2、pymysql安装方法为:解压下载的文件,在cmd中运行: python setuppy install。
检验安装安装是否成功的方法:import pymysql 。 如果不报错 说明安装成功。
3、mysql安装目录为D:/phpStudy/MySQL。为避免更多配置问题,可在启动phpstudy后,将其设为系统服务
4、基本 *** 作:
(1)导入pymysql: import pymysql
(2)连接数据库:
conn=pymysqlconnect(host='localhost',user='root',passwd='root',db='ere',charset='utf8')
务必注意各等号前面的内容!charset参数可避免中文乱码
(3)获取 *** 作游标:cur=conncursor()
(4)执行sql语句,插入记录:sta=curexecute("insert 语句") 执行成功后sta值为1。更新、删除语句与此类似。
(5)执行sql语句,查询记录:curexecute("select语句") 执行成功后cur变量中保存了查询结果记录集,然后再用循环打印结果:
for each in cur:
print(each[1]decode('utf-8')) # each[1] 表示当前游标所在行的的第2列值,如果是中文则需要处理编码
你的 sqlite3数据库是用 SEE 加密的吗? 如果是了话,试一下通过python执行以下sqlite pragma命令来提供解密key
PRAGMA key='your-secret-key';根据 SEE的文档,通过 PRAGMA 命令也可以提供解密key,而不需 sqlite3_key_v2() 这个C API。你试一下。
由于版本的不同,Python 连接 Hive 的方式也就不一样。
在网上搜索关键字 python hive 的时候可以找到一些解决方案。大部分是这样的,首先把hive 根目录下的$HIVE_HOME/lib/py拷贝到 python 的库中,也就是 site-package 中,或者干脆把新写的 python 代码和拷贝的 py 库放在同一个目录下,然后用这个目录下提供的 thrift 接口调用。示例也是非常简单的。类似这样:
import sys
from hive_service import ThriftHive
from hive_servicettypes import HiveServerException
from thrift import Thrift
from thrifttransport import TSocket
from thrifttransport import TTransport
from thriftprotocol import TBinaryProtocol
def hiveExe(sql):
try:
transport = TSocketTSocket('127001', 10000)
transport = TTransportTBufferedTransport(transport)
protocol = TBinaryProtocolTBinaryProtocol(transport)
client = ThriftHiveClient(protocol)
transportopen()
clientexecute(sql)
print "The return value is : "
print clientfetchAll()
print ""
transportclose()
except ThriftTException, tx:
print '%s' % (txmessage)
if __name__ == '__main__':
hiveExe("show tables")1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728
或者是这样的:
#!/usr/bin/env python
import sys
from hive import ThriftHive
from hivettypes import HiveServerException
from thrift import Thrift
from thrifttransport import TSocket
from thrifttransport import TTransport
from thriftprotocol import TBinaryProtocol
try:
transport = TSocketTSocket('1418154188', 10000)
transport = TTransportTBufferedTransport(transport)
protocol = TBinaryProtocolTBinaryProtocol(transport)
client = ThriftHiveClient(protocol)
transportopen()
clientexecute("CREATE TABLE r(a STRING, b INT, c DOUBLE)")
clientexecute("LOAD TABLE LOCAL INPATH '/path' INTO TABLE r")
clientexecute("SELECT FROM test1")
while (1):
row = clientfetchOne()
if (row == None):
break
print rowve
clientexecute("SELECT FROM test1")
print clientfetchAll()
transportclose()
except ThriftTException, tx:
print '%s' % (txmessage)
12345678910111213141516171819202122232425262728293031323334351234567891011121314151617181920212223242526272829303132333435
但是都解决不了问题,从 netstat 中查看可以发现 TCP 连接确实是建立了,但是不执行 hive 指令。也许就是版本的问题。
还是那句话,看各种中文博客不如看官方文档。
项目中使用的 hive 版本是013,此时此刻官网的最新版本都到了121了。中间间隔了120、110、100、0140。但是还是参考一下官网的方法试试吧。
首先看官网的 setting up hiveserver2
可以看到启动 hiveserver2 可以配置最大最小线程数,绑定的 IP,绑定的端口,还可以设置认证方式。(之前一直不成功正式因为这个连接方式)然后还给了 python 示例代码。
import pyhs2
with pyhs2connect(host='localhost',
port=10000,
authMechanism="PLAIN",
user='root',
password='test',
database='default') as conn:
with conncursor() as cur:
#Show databases
print curgetDatabases()
#Execute query
curexecute("select from table")
#Return column info from query
print curgetSchema()
#Fetch table results
for i in curfetch():
print i123456789101112131415161718192021123456789101112131415161718192021
在拿到这个代码的时候,自以为是的把认证信息给去掉了。然后运行发现跟之前博客里介绍的方法结果一样,建立了 TCP 连接,但是就是不执行,也不报错。这是几个意思?然后无意中尝试了一下原封不动的使用上面的代码。结果可以用。唉。。。
首先声明一下,hive-sitexml中默认关于 hiveserver2的配置我一个都没有修改,一直是默认配置启动 hiveserver2。没想到的是默认配置是有认证机制的。
然后再写一点,在安装 pyhs2的时候还是遇到了点问题,其实还是要看官方文档的,我只是没看官方文档直接用 pip安装导致了这个问题。安装 pyhs2需要确定已经安装了几个依赖包。直接看在 github 上的 wiki 吧。哪个没安装就补上哪一个就好了。
以上就是关于python怎么连接mysql数据库全部的内容,包括:python怎么连接mysql数据库、如何用python3连接mysql数据库、python3.4怎么连接mysql pymysql连接mysql数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)