安装 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()