麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
1245
2023-05-06
一步一步教你如何用Python操作MySQL
工欲善其事,必先利其器。所以***步,我们先下载第三方库。在这里,我用到的是pymysql库。
下载库:在命令行输入
pip install pymysql
下载后可检验一下是否成功下载。直接在命令行进入python然后导库即可
C:\Users\June>python Python 3.6.3 |Anaconda, Inc.| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pymysql >>>
看到这个画面就说明下载成功了,接下来学习如何操作数据库了!!!
连接数据库
import pymysql # 连接数据库 db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')
以上的参数是必填的
host: 这个是ip地址,因为我这里是本地的,所以填127.0.0.1,也可以填localhost。user:用户名,如果你也是本地的,就填root好了passwd:这个是密码,填上你自己设的密码就可以了db:这个是数据库名,我这里选的是news数据库port:这个是端口,本地的一般都是3306charset:这个是编码方式,要和你数据库的编码方式一致,要不会连接失败
连接上了,怎么验证呢?这里我们可以选择查一条数据
try: db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8') # 检验数据库是否连接成功 cursor = db.cursor() # 这个是执行sql语句,返回的是影响的条数 data = cursor.execute('SELECT * FROM `new`') # 得到一条数据 one = cursor.fetchone() print(data) print(one) except pymysql.Error as e: print(e) print('操作数据库失败') finally: # 如果连接成功就要关闭数据库 if db: db.close()
代码解读:因为在连接数据库中,有时会发生连接失败等异常,所以这里就进行捕捉异常,这里的异常都是在 pymsql.Error 里面。上面的代码看不懂也没关系,因为我接下来会说,如果运行后有结果证明连接成功。
在用完后,一定要记得关闭数据库连接,防止资源泄露问题。
对数据进行查询
import pymysql try: conn = pymysql.connect(host='127.0.0.1',user='root',passwd='password',db='news',charset='utf8',port=3306) # 这个是光标,用来操作数据库语句 cursor = conn.cursor() # 执行sql语句 cursor.execute('SELECT * FROM `new`') print(cursor.fetchone()) # 关闭光标 cursor.close() except pymysql.Error as e: print(e) print('操作数据库失败') finally: if conn: conn.close()
代码解读:
cursor():这个是光标,用来执行mysql语句的,用完后也是需要关闭的excute():这个是执行语句,执行参数的mysql语句fetchone():这个是查看执行语句后的一条数据fetchall():这个是查看所有数据
在查询数据后,返回的是一整条数据,有没有可以按字典形式来查询的呢?来试试!
print(cursor.fetchone()['name']) Traceback (most recent call last): File "E:/anaconda/python_project/mysql_test/test2.py", line 8, in
查了之后,编译器想都不想就给了我这个错误,说这是个元组,不能这样操作。
虽然python没有提供,但是我们可以手动转成字典来查询啊
cursor这里有个属性:description。获取的是数据库每个栏位情况,如下:
print(cursor.description) # 下面是结果 (('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False), ('title', 253, None, 50, 50, 0, False), ('content', 253, None, 2000, 2000, 0, False), ('view_count', 3, None, 11, 11, 0, False), ('release_time', 12, None, 19, 19, 0, False), ('author', 253, None, 20, 20, 0, True), ('from', 253, None, 20, 20, 0, True), ('is_valibale', 3, None, 11, 11, 0, False)
所以,我们利用这个属性手动生成字典
# 将一条数据转成字典方便查找 new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()])) print(new) # 下面是结果 {'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 'content': '他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '***体育', 'is_valibale': 1}
这里利用zip函数和列表生成式来一行代码就生成成功了
用字典来查询,现在就可以了
print(new['title']) # 下面是结果 考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福
但是,上面的只是一条数据的,如果是多条的呢?再按上面的方法就行不通了。这时就需要用到map函数了
def new2dict(new): return dict(zip([x[0] for x in cursor.description],[x for x in new])) news_list = list(map(new2dict,cursor.fetchall())) print(news_list) # 下面是结果 [{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 'content': '他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '***体育', 'is_valibale': 1}, {'id': 3, 'type': 'NBA', 'title': '火箭挖21分大哈登得背锅 连遭浓眉大帽太尴尬', 'content': '火箭在客场以113-115惜败于鹈鹕,4连胜终结。詹姆斯-哈登出战34分钟16投5中,其中三分球9投只有1中,罚球14罚12中,拿到23分、11助攻、5篮板但也有4次失误,其在场正负值为尴尬的-12分', 'view_count': 7520, 'release_time': datetime.datetime(2018, 1, 27, 12, 5), 'author': 'youngcao', 'from': '***体育','is_valibale': 1}, {'id': 4, 'type': '英超', 'title': '足总杯-曼联4-0英乙球队晋级 桑神首秀造两球', 'content': '2017-18赛季英格兰足总杯第4轮,曼联客场4比0击败英乙球队约维尔,顺利晋级下一轮。桑切斯迎来曼联首秀,并制造了两个入球', 'view_count': 6560, 'release_time': datetime.datetime(2018, 1, 27, 5, 49), 'author': 'ricazhang', 'from': '***体育','is_valibale': 1}, {'id': 5, 'type': '英超', 'title': '这才配红魔7号!桑神首秀大腿级表演 回击嘘声质疑', 'content': '在今天凌晨对阵约维尔的首秀也值得期待。虽然在登场的72分钟时间里没有进球,但送出1次助攻且有有6次威胁传球的数据还是十分亮眼', 'view_count': 2760, 'release_time': datetime.datetime(2018, 1, 27, 6, 13), 'author': 'yaxinhao', 'from': '***体育', 'is_valibale': 1}]
这里很巧妙的利用了map函数,因为多条数据就可以进行迭代了,需要操作每条数据,这样就可以想到map函数
接下来我们再用面向对象的方法来用python进行查询数据库
import pymysql class MysqlSearch(object): def get_conn(self): '''连接mysql数据库''' try: self.conn = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',port=3306,charset='utf8',db='news') except pymysql.Error as e: print(e) print('连接数据库失败') def close_conn(self): '''关闭数据库''' try: if self.conn: self.conn.close() except pymysql.Error as e: print(e) print('关闭数据库失败') def get_one(self): '''查询一条数据''' try: # 这个是连接数据库 self.get_conn() # 查询语句 sql = 'SELECT * FROM `new` WHERE `type`=%s' # 这个光标用来执行sql语句 cursor = self.conn.cursor() cursor.execute(sql,('英超',)) new = cursor.fetchone() # 返回一个字典,让用户可以按数据类型来获取数据 new_dict = dict(zip([x[0] for x in cursor.description],new)) # 关闭cursor cursor.close() self.close_conn() return new_dict except AttributeError as e: print(e) return None def get_all(self): '''获取所有结果''' sql = 'SELECT * FROM `new` ' self.get_conn() try: cursor = self.conn.cursor() cursor.execute(sql) news = cursor.fetchall() # 将数据转为字典,让用户根据键来查数据 news_list =list(map(lambda x:dict(zip([x[0] for x in cursor.description],[d for d in x])),news)) # 这样也行,连续用两个列表生成式 news_list = [dict(zip([x[0] for x in cursor.description],row)) for row in news] cursor.close() self.close_conn() return news_list except AttributeError as e: print(e) return None def main(): # 获取一条数据 news = MysqlSearch() new = news.get_one() if new: print(new) else: print('操作失败') # 获取多条数据 news = MysqlSearch() rest = news.get_all() if rest: print(rest) print(rest[7]['type'],rest[7]['title']) print('类型:{0},标题:{1}'.format(rest[12]['type'],rest[12]['title'])) for row in rest: print(row) else: print('没有获取到数据') if __name__ == '__main__': main()
这样就可以通过实例的方法来进行查询数据库了
我们还可以根据页数来进行查询指定的数据数
def get_more(self,page,page_size): '''查多少页的多少条数据''' offset = (page-1)*page_size sql = 'SELECT * FROM `new` LIMIT %s,%s' try: self.get_conn() cursor = self.conn.cursor() cursor.execute(sql,(offset,page_size,)) news = [dict(zip([x[0] for x in cursor.description],new)) for new in cursor.fetchall()] cursor.close() self.close_conn() return news except AttributeError as e: print(e) return None def main(): #获取某页的数据 news = MysqlSearch() new = news.get_more(3,5) if new: for row in new: print(row) else: print('获取数据失败') if __name__ == '__main__': main()
利用的是mysql的limit关键字,还有其他的,比如进行排序分组的感兴趣的可以自己尝试下
增加数据到数据库
还有修改数据和删除数据就不贴出来了,只是把上面的sql变量的语句改成修改或者删除的语句就可以了,如果你还不会,建议练习下
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。