Python学习笔记15—mysql的操作
安装 Python-MySQLdb#
pip install mysql-Python
Python对mysql的操作#
建立一个实验数据库demo
mysql> create database demo character set utf8; Query OK, 1 row affected (0.00 sec)
mysql> use demo
Database changed
mysql> create table users(id int(2) not null primary key auto_increment,username varchar(40),password text,email text);
Query OK, 0 rows affected (0.02 sec)
连接demo数据库
>>> import MySQLdb >>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123456",db="demo",port=3306,charset="utf8")
Python 建立了与数据的连接,其实是建立了一个MySQLdb.connect() 的实例对象,或者泛泛地称之为连接对象,Python 就是通过连接对象和数据库对话。这个对象常用的方法有:
• commit():如果数据库表进行了修改,提交保存当前的数据。当然,如果此用户没有权限就作罢了,什么也不会发生。
• rollback():如果有权限,就取消当前的操作,否则报错。
• cursor([cursorclass]):返回连接的游标对象。通过游标执行 SQL 查询并检查结果。游标比连接支持更多的方法,而且可能在程序中更好用。
• close():关闭连接。此后,连接对象和游标都不再可用了。
Python 和数据之间的连接建立起来之后,要操作数据库,就需要让 Python 对数据库执行 SQL 语句。Python是通过游标执行 SQL 语句的。所以,连接建立之后,就要利用连接对象得到游标对象,方法如下:
操作数据库
Python 和数据之间的连接建立起来之后,要操作数据库,就需要让 Python 对数据库执行 SQL 语句。Python是通过游标执行 SQL 语句的。所以,连接建立之后,就要利用连接对象得到游标对象,方法如下:
>>> cur = conn.cursor()
此后,就可以利用游标对象的方法对数据库进行操作。那么还得了解游标对象的常用方法:
创建表
>>> cur.execute("create table users(id int(2) not null primary key auto_increment,username varchar(40),password text,email text)") 0L
插入
>>> cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("Python","123456","Python@gmail.com")) 1L
提交数据
conn.commit()
查询
>>> cur.execute("select * from users") 2L >>> lines = cur.fetchall() >>> for line in lines: ... print line ... (1L, u'Python', u'123456', u'Python@gmail.com') (2L, u'Java', u'123456', u'Java@gmail.com')
查询一条结果
>>> cur.execute("select * from users where id=1") 1L >>> line_first = cur.fetchone() >>> print line_first (1L, u'Python', u'123456', u'Python@gmail.com')
注意:通过游标找出来的对象,在读取的时候有一个特点,就是那个游标会移动。在第一次操作了 print cur.fetchall()后,因为是将所有的都打印出来,游标就从第一条移动到最后一条。当 print 结束之后,游标已经在最后一条当 print 结束之后,游标已经在最后一条的后面了。接下来如果再次打印,就空了,最后一条后面没有东西了。
>>> cur.execute("select * from users") 2L >>> print cur.fetchall() ((1L, u'Python', u'123456', u'Python@gmail.com'), (2L, u'Java', u'123456', u'Java@gmail.com')) >>> print cur.fetchall() ()
通过fetchone可以看的更加的清楚
>>> cur.execute("select * from users") 2L >>> print cur.fetchone() (1L, u'Python', u'123456', u'Python@gmail.com') >>> print cur.fetchone() (2L, u'Java', u'123456', u'Java@gmail.com')
那么,既然在操作存储在内存中的对象时候,游标会移动,能不能让游标向上移动,或者移动到指定位置呢?这就是那个 scroll()
>>> print cur.fetchone() (1L, u'Python', u'123456', u'Python@gmail.com') >>> cur.scroll(1) #向下移动1 >>> print cur.fetchone() (3L, u'C++', u'123456', u'C++@gmail.com') >>> cur.scroll(-2) #向上移动1 >>> print cur.fetchone() (2L, u'Java', u'123456', u'Java@gmail.com') >>> print cur.fetchone() (3L, u'C++', u'123456', u'C++@gmail.com') >>> cur.scroll(-3) >>> print cur.fetchone() (1L, u'Python', u'123456', u'Python@gmail.com')
使用绝对路径的方法
>>> cur.execute("select * from users") 3L >>> print cur.fetchall() ((1L, u'Python', u'123456', u'Python@gmail.com'), (2L, u'Java', u'123456', u'Java@gmail.com'), (3L, u'C++', u'123456', u'C++@gmail.com')) >>> cur.scroll(0,"absolute") #回到序号是 0,即指向 tuple 的第一条 >>> print cur.fetchone() (1L, u'Python', u'123456', u'Python@gmail.com') >>> cur.scroll(2,"absolute") #回到序号是 2,即指向 tuple 的第三条 >>> print cur.fetchone() (3L, u'C++', u'123456', u'C++@gmail.com') >>> cur.scroll(0,"absolute") >>> print cur.fetchone() (1L, u'Python', u'123456', u'Python@gmail.com')
还有一个fetchmany,一次读取多条
>>> cur.execute("select * from users")
3L
>>> cur.fetchmany(2)
((1L, u'Python', u'123456', u'Python@gmail.com'), (2L, u'Java', u'123456', u'Java@gmail.com'))
将读取到的数据变成字典
>>> cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) >>> cur.execute("select * from users") 3L >>> cur.fetchall() ({'username': u'Python', 'password': u'123456', 'id': 1L, 'email': u'Python@gmail.com'}, {'username': u'Java', 'password': u'123456', 'id': 2L, 'email': u'Java@gmail.com'}, {'username': u'C++', 'password': u'123456', 'id': 3L, 'email': u'C++@gmail.com'})
这样元组里面的元素就是数据字典
>>> cur.scroll(0,"absolute") >>> for line in cur.fetchall(): ... print line["username"] ... Python Java C++
更新#
>>> cur.execute("update users set username='Ruby' where id=4") 1L >>> cur.execute("select * from users where id=4") 1L >>> cur.fetchone() (4L, u'Ruby', u'123456', u'Python@gmail.com')
不过,要真的实现在数据库中更新,还要运行:
>>> conn.commit()
这就大事完吉了。
应该还有个小尾巴,那就是当你操作数据完毕,不要忘记关门:
>>> cur.close()
>>> conn.close()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了