时间:2021-05-22
来一个简单的例子,看Python如何操作数据库,相比Java的JDBC来说,确实非常简单,省去了很多复杂的重复工作,只关心数据的获取与操作。
准备工作
需要有相应的环境和模块:
注意:Ubuntu 自带安装了Python,但是要使用Python连接数据库,还需要安装MySQLdb模块,安装方法也很简单:
sudo apt-get install MySQLdb然后进入Python环境,import这个包,如果没有报错,则安装成功了:
pythonPython 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import MySQLdb>>>Python标准的数据库接口的Python DB-API(包括Python操作MySQL)。大多数Python数据库接口坚持这个标准。不同的数据库也就需要不同额模块,由于我本机装的是MySQL,所以使用了MySQLdb模块,对不同的数据库而言,只需要更改底层实现了接口的模块,代码不需要改,这就是模块的作用。
Python数据库操作
首先我们需要一个测试表
建表语句:
Python代码
# --coding=utf8--import ConfigParserimport sysimport MySQLdbdef init_db(): try: conn = MySQLdb.connect(host=conf.get('Database', 'host'), user=conf.get('Database', 'user'), passwd=conf.get('Database', 'passwd'), db=conf.get('Database', 'db'), charset='utf8') return conn except: print "Error:数据库连接错误" return Nonedef select_demo(conn, sql): try: cursor = conn.cursor() cursor.execute(sql) return cursor.fetchall() except: print "Error:数据库连接错误" return Nonedef update_demo(): passdef delete_demo(): passdef insert_demo(): passif __name__ == '__main__': conf = ConfigParser.ConfigParser() conf.read('mysql.conf') conn = init_db() sql = "select * from %s" % conf.get('Database', 'table') data = select_demo(conn, sql) passfetchall()字段特殊字符过滤处理
最近在做数据仓库的迁移工作,之前数据仓库的数据都是用的shell脚本来抽取,后来换了python脚本.
但是在把数据抽取存放到hadoop时,出现了一个问题:
由于数据库字段很多,提前也不知道数据库字段会存储什么内容,hive建表是以\t\n做分隔,这就导致了一个问题,如果mysql字段内容里面本身含有\t\n,那么就会出现字段错位情况,并且很头疼的是mysql有100多个字段,也不知道哪个字段会出现这个问题.
shell脚本里的做法是在需要抽取的字段上用mysql的replace函数对字段进行替换,例如,假设mysql里的字段是column1 varchar(2000),那么很可能就会出现有特殊字符的情况,在查询的sql语句里加上
之前一直是这么干的,但是这样写sql特别长,特别是有100多个字段,也不知道哪个有特殊字符,只要都加上.
所以在python中对字段不加处理,最终导致hive表字段对应出现偏差,所以在python里从mysql查询到的字段在写到文件之前需要对每个字段进行过滤处理
看个例子,我就以mysql测试为例,首先建一张测试表
有六个字段,都是varchar类型,插入新数据可以在里面插入特殊字符.简单插入条数据测试看看:
insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test01','test02','test03','test04','test05','test06');insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test11\ntest11','test12\n\n','test13','test14','test15','test16');insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test21\ttest21','test22\ttest22\ttest22','test23\t\t\t','test4','test5','test6');insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test21\rest21','test22\r\rest22\r\rest22','test23\r\r\r','test4','test5','test6');其中数据里插入的特殊字符,可能连在一起,也有不连在一起的.
python测试代码:
看看输出结果:
字段未过滤查询结果
字段过滤之后结果
可以看到,制表符,换行符,回车都被过滤了.
建议:最后说点题外话,不要小视\r,回车符.很多人以为回车符就是换行符,其实不是的,\r表示回车符,\n表示新行.之前代码里其实是过滤掉了\t\n的,但是抽取的数据还是不对,后来看了源码之后才发现,原来是没有过滤\r,就这个不同导致了很多数据抽取不对.
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了MySQL产生随机数并连接字符串的方法。分享给大家供大家参考,具体如下:用到的方法:concat('a','b','c');连接字符串rand()
本文实例讲述了python实现mysql的单引号字符串过滤方法。分享给大家供大家参考,具体如下:最主要用这个函数,可以处理MySQLdb.escape_stri
1:数字型参数使用类似intval,floatval这样的方法强制过滤。2:字符串型参数使用类似mysql_real_escape_string这样的方法强制过
本文实例讲述了C#实现过滤sql特殊字符的方法集合。分享给大家供大家参考,具体如下:1.//////过滤不安全的字符串/////////publicstatic
前言这篇文章抓哟讲解了关于如何实现在MySQL中创建带有特殊字符的数据库名称,这里的特殊字符包含:!@#$%^方法如下使用反引号`将数据库名称包含住,反引号`(