设为首页 - 加入收藏  
您的当前位置:首页 >数据库 >一步一步教你如何用Python操作MySQL 正文

一步一步教你如何用Python操作MySQL

来源:亿华互联编辑:数据库时间:2025-11-05 02:46:48

工欲善其事,步步必先利其器。教何所以***步,步步我们先下载第三方库。教何在这里,步步我用到的教何是pymysql库。

下载库:在命令行输入 

复制pip install pymysql1.

下载后可检验一下是步步否成功下载。直接在命令行进入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

>>>1.2.3.4.5.

看到这个画面就说明下载成功了,接下来学习如何操作数据库了!步步!教何!步步

连接数据库 

复制import pymysql

# 连接数据库

db = pymysql.connect(host=127.0.0.1,教何user=root,passwd=your password,db=news,port=3306,charset=utf8)1.2.3.

以上的参数是必填的

host: 这个是ip地址,因为我这里是步步本地的,所以填127.0.0.1,教何也可以填localhost。步步user:用户名,如果你也是本地的,就填root好了passwd:这个是密码,填上你自己设的密码就可以了db:这个是数据库名,我这里选的WordPress模板是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()1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.

代码解读:因为在连接数据库中,有时会发生连接失败等异常,所以这里就进行捕捉异常,这里的异常都是在 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()1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

代码解读:

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

print(cursor.fetchone()[name])

TypeError: tuple indices must be integers or slices, not str1.2.3.4.5.

查了之后,编译器想都不想就给了我这个错误,说这是个元组,不能这样操作。

虽然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)1.2.3.

 所以,我们利用这个属性手动生成字典 

复制# 将一条数据转成字典方便查找

new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))

print(new)

# 下面是结果

{id: 2, type: NBA, title: 考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福, content: 他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。b2b信息网这无疑对考辛斯和鹈鹕队都是一个重大的打击, view_count: 3560, release_time: datetime.datetime(2018, 1, 27, 12, 10), author: xiaoylin, from: 腾讯体育, is_valibale: 1}1.2.3.4.5.

 这里利用zip函数和列表生成式来一行代码就生成成功了

用字典来查询,现在就可以了 

复制print(new[title])

# 下面是结果

考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福1.2.3.

但是,上面的只是一条数据的,如果是多条的呢?再按上面的方法就行不通了。这时就需要用到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}]1.2.3.4.5.6.

 这里很巧妙的利用了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(类型:,标题:{1}.format(rest[12][type],rest[12][title]))

for row in rest:

print(row)

else:

print(没有获取到数据)

if __name__ == __main__:

main()1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.

这样就可以通过实例的方法来进行查询数据库了

我们还可以根据页数来进行查询指定的数据数 

复制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()1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.

利用的是mysql的limit关键字,还有其他的,比如进行排序分组的感兴趣的可以自己尝试下

增加数据到数据库 

复制def add_one(self):

sql = INSERT INTO `new`(`title`,`content`,`type`,`view_count`,`release_time`) VALUE(%s,%s,%s,%s,%s)

try:

self.get_conn()

cursor = self.conn.cursor()

cursor.execute(sql, (title, content, type, 1111, 2018-02-01))

cursor.execute(sql, (标题, 内容, 类型, 0000, 2018-02-01))

# 一定需要提交事务,要不不会显示,只会占位在数据库

self.conn.commit()

return 1

except AttributeError as e:

print(Error:, e)

return 0

except TypeError as e:

print(Error:, e)

# 发生错误还提交就是把执行正确的语句提交上去

# self.conn.commit()

# 下面这个方法是发生异常就全部不能提交,但语句执行成功的就会占位

self.conn.rollback()

return 0

finally:

cursor.close()

self.close_conn()

def main():

news = OperateSQL()

if news.add_one():

print(增加数据成功)

else:

print(发生异常,请检查!!!)

if __name__ == __main__:

main()1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.

因为是增加数据,所以需要提交事务,这就需要用到conn  .commit()来进行提交,在增加数据后,如果不提交,数据库就不会显示。 

还有修改数据和删除数据就不贴出来了,只是把上面的sql变量的语句改成修改或者删除的语句就可以了,如果你还不会,建议练习下 

0.1439s , 11797.0390625 kb

Copyright © 2025 Powered by 一步一步教你如何用Python操作MySQL,亿华互联  滇ICP备2023000592号-16

sitemap

Top