作为其他说话的比如java我们都晓得使用hibernate可以直接毗连数据库那么Python毗连数据库是怎样样的呢?
好了话不多说我们先看看Python是怎样使用MySQL数据库的呢
一、跟其他的说话一样首先先安装MySQL数据库若是是windows 用户,mysql 的安装很是简单,直接下载安装文件,双击安装文件一步一步停止把持即可。
Linux 下的安装可能会加倍简单,除了下载安装包停止安装外,一样平常的linux 堆栈中都市有mysql ,我们只必要经由过程一个呼吁就可以下载安装:
Ubuntudeepin
>>sudo apt-get install mysql-server
>>Sudo apt-get install mysql-client
centOS/redhat
>>yum install mysql
二,安装MySQL-python要想使python可以把持mysql 就必要MySQL-python驱动,它是python 把持mysql必不成少的模块。
下载地点:https://pypi.python.org/pypi/MySQL-python/
下载MySQL-python-1.2.5.zip 文件之后直接解压。进入MySQL-python-1.2.5目录:
>>python setup.py install
三,测试
测试很是简单,搜检MySQLdb 模块是否可以正常导入。
没有报错提示MySQLdb模块找不到,声名安装OK ,下面起头使用python 把持数据库之前,我们有必要往返首回头回忆一下mysql的根基把持:
四,mysql 的根基把持$ mysql -u root -p (有密码时)
$ mysql -u root (无密码时)
五,python 把持mysql数据库根本>>> conn = MySQLdb.connect(host='localhost',port = 3306,user='root', passwd='123456',db ='test',)
Connect() 编制用于建树数据库的毗连,里面可以指定参数:用户名,密码,主机等信息。
这只是毗连到了数据库,要想把持数据库必要建树游标。
>>> cur = conn.cursor()
经由过程获取到的数据库毗连conn下的cursor()编制来建树游标。
>>> cur.execute("create table student(id int ,name varchar(20),class varchar(30),age varchar(10))")
经由过程游标cur 把持execute()编制可以写入纯sql语句。经由过程execute()编制中写如sql语句来对数据停止把持。
>>>cur.close()
cur.close() 封锁游标
>>>conn.commit()
conn.commit()编制在提交事物,在向数据库插入一条数据时必需要有这个编制,不然数据不会被真正的插入。
>>>conn.close()
Conn.close()封锁数据库毗连
六,插入数据经由过程上面execute()编制中写入纯的sql语句来插入数据并不便当。如:
>>>cur.execute("insert into student values('2','Tom','3 year 2 class','9')")
我要想插入新的数据,必需要对这条语句中的值做改削。我们可以做如下改削:
假设要一次向数据表中插入多条值呢?
executemany()编制可以一次插入多条值,实行单挑sql语句,可是频频实行参数列表里的参数,前往值为受影响的行数。
七,查询数据
大概你已经考试考试了在python中经由过程
>>>cur.execute("select * from student")
来查询数据表中的数据,但它并没有把表中的数据打印出来,有些绝望。
来看看这条语句获得的是什么
>>>aa=cur.execute("select * from student")
>>>print aa
5
它获得的只是我们的表中有若干好多条数据。那若何才能获得表中的数据呢?进入python shell
fetchone()编制可以辅佐我们获得表中的数据,可是每次实行cur.fetchone() 获得的数据都不一样,换句话说我没实行一次,游标会从表中的第一条数据挪动到下一条数据的位置,所以,我再次实行的时辰获得的是第二条数据。
scroll(0,'absolute') 编制可以将游标定位到表中的第一条数据。
仍是没处理我们想要的成效,若何获得表中的多条数据并打印出来呢?
经由过程之前的print aa 我们晓得当前的表中有5条数据,fetchmany()编制可以获得多条数据,但必要指定命据的条数,经由过程一个for轮回就可以把多条数据打印出啦!实行成效如下:
Python说话里面有一些小的坑,特别随意弄混弄错,初学者若不注意的话,很随意坑进去,下面我给大师深切解析一些这几个坑,希望对初学者有所辅佐.
1.i+=1 不便是++i
初学者对Python说话不是特别体味的话,又恰好有c++,java的说话背景,很随意把++i和i+=1弄混
先来看一个小例子:
i=0
mylist=[1,2,3,4,5,6]
while i<len(mylist):< p="" style="box-sizing: border-box;">
print(mylist[i])
++i
这段代码会想固然的认为,没有啥问题啊,一个轮回输出,i不竭的+1,蛮对的呀.其实不是的,这个代码会不息输出1,一个死轮回.由于Python的诠释器会将++i把持为+(+i).其中+表示是负数符号,对付--i也是近似的.
print(+1)
>>>1
print(++1)
>>>1
print(+++1)
>>>1
这下明白了++i虽然在Python语法是合法的,可是并不是我们理解的自增的把持.
2.分清楚==和is的用法
在断定字符串是否相称的时辰,初学者特别会弄混is和==,如许的成效是轨范在不合的情形下默示不合:
比如先看一个简单的例子:
a='Hi'
b='Hi'
print(a is b)
>>>True
print(a==b)
>>>True #看起来is和==仿佛是一样的
我们再看第二个例子:
str1='Wo shi yi ge chi huo'
str2='Wo shi yi ge chi huo'
print(str1 is str2)
>>>False#is的成效是False
print(str1==str2)
>>>True #==的成效为True,看二者不一样了吧
第三个例子
str3='string'
str4=''.join(['s','t','r','i','n','g'])
print(str3)
>>>string
print(str3 is str4)
>>>False #is的成效是False
print(str3==str4)
>>>True #==的成效为True,看二者不一样了吧
这就是很随意同化初学者的地方,感受很奇异,为什么有的时辰is和==输出不异,有的时辰不合呢.好我们来一探现实:
我们用内置的id()这函数,这个函数用来前往工具的内存地点,查一下就清楚了
is是工具的标示符,用来斗劲两个工具的内存空间是不是一样,是不是用的统一块空间地点,而==是斗劲两个工具的内容是否相称.
3.毗连字符串特别是大规模的字符串,最好用join 而不是+
字符串措置的时辰,最常用的是毗连,Python中的字符串与其他的说话有一点不合,它是不成变工具,一旦建树不能改变.而这个特征直接会影响到Python中字符串毗连的服从.
用+毗连字符串:
str1,str2,str3='test','string','connection'
print(str1+str2+str3)
>>>test string connection
用join毗连字符串
str1,str2,str3='test ','string ','connection'
print(''.join([str1,str2,str3]))
>>>test string connection
可是若是毗连大规模的字符串,比如要毗连10万摆布的字符串的时辰,join的编制服从就会快良多(甚至相差百倍).比如下面这10万个字符串毗连.
long_str_list=['This is a long string' for n in range(1,100000)]
缘故缘由是由于若要毗连字符串:S1+S2+S3+....+SN,由于字符串是不成变的工具,实行一次就要申请一块新的内存,如许的话在N个字符串毗连的过程中,会产生N-1个中心成效,每产生一个中心成效就要申请一次内存,如许会严峻影响实行服从.
而join不一样,它是一次性申请总的内存,然后把字符串里面的每一个元素复制到内存中去,所以join会快良多.
是以,字符串的毗连,尤其是大的字符串措置,最好用join
4.不要在for 和while 轮回后面写else 块
Python 供给了一种良多编程说话都不支撑的功能,那就是可以在轮回内部的语句块后面直接编写else 块。比如:
for i in range(3):
print('Loop %d'%i)
else:
print('Else block')
>>>Loop 0
>>>Loop 1
>>>Loop 2
>>>Else block
这种else 块会在整个轮回实行完之后马上运转。既然如斯,那它为什么叫做else 呢?为什么不叫and ?在if/else 语句中,else 的意思是:若是不实行前面阿谁if 块,那就实行else 块。
同理try/except/else 也是如斯,该构造的else 的寄义是:若是前面的try 块没有失败,那就实行else 块。
try/finally 同样很是直不雅观不雅观,这里的finally 的意思是:实行过前面的try 块之后,不管若何老是实行finally块。
问题来了对付刚接触Python 的轨范员可能会把for/else 构造中的else 块理解为:若是轮回没有正常实行完,那就实行else 块。
实际上刚好相反——在轮回里用break语句提早跳出,会导致轨范不实行else 块,这一点会有点绕.对付不熟悉for/else 的人来说,会令阅读代码的人感应相称费解.
如有疑问欢迎留下评论我会一一解答!