mysql登陆

登陆:mysql -uroot -h127.0.0.1 -P3306 -p

mysql -uroot -p(本机不用写host)

退出mysql:ctrl+z+回车,或者exit

端口号默认是3306,但是可以通过安装目录下的配置文件修改。

使用流程

引用API模块

获取与数据库的连接

执行sql语句与存储过程

关闭数据库连接

安装pymysql

python3 与MySQL 进行交互编程需要安装 pymysql 库,故首先使用如下命令安装pymysql

–>pip install pymysql

pymysql.connect()连接数据库函数

代码示例:

import pymysql

#打开数据库连接

conn = pymysql.connect('localhost',user = "root", passwd =

"123456",db = "testdb")

print (conn)

print (type(conn))

conn.cursor():获取游标

要想操作数据库,光连接数据是不够的,必须拿到操作数据库的游标,才能进行后续的操作,比如读取数据、添加数据。通过获取到的数据库连接实例conn下的cursor()方法来创建游标。游标用来接收返回结果

代码示例:

import pymysql

#打开数据库连接

conn=pymysql.connect('localhost',user="root", passwd= "123456",db =

"testdb")

#获取游标

cursor=conn.cursor()

print(cursor)

说明:cursor返回一个游标实例对象,其中包含了很多操作数据的方法,比如执行sql语句。

执行sql语句execute和executemany

execute(query,args=None)

函数作用:执行单条的sql语句,执行成功后返回受影响的行数

参数说明:

query:要执行的sql语句,字符串类型

args:可选的序列或映射,用于query的参数值。如果args为序列,query中必须使用%s做占位符;如果args为映射,query中必须使用%(key)s做占位符

executemany(query,args=None)

函数作用:批量执行sql语句,比如批量插入数据,执行成功后返回受影响的行数

参数说明:

query:要执行的sql语句,字符串类型

args:嵌套的序列或映射,用于query的参数值

注意:

1.数据库性能瓶颈很大一部份就在于网络IO和磁盘IO,将多个sql语句放在一起,只执行一次IO,可以有效的提升数据库性能。推荐此方法

2.用executemany()方法一次性批量执行sql语句,固然很好,但是当数据一次传入过多到server端,可能造成server端的buffer溢出,也可能产生一些意想不到的麻烦。所以,合理、分批次使用executemany是个合理的办法

创建数据库

代码示例:

'''创建数据库'''

import pymysql

#打开数据库连接,不需要指定数据库,因为需要创建数据库

conn = pymysql.connect('localhost',user = "root", passwd =

"123456")

#获取游标

cursor=conn.cursor()

#创建pythonBD数据库

cursor.execute('CREATE DATABASE IF NOT EXISTS pythonDB DEFAULT

CHARSET utf8 COLLATE utf8_general_ci;')

cursor.close()#先关闭游标

conn.close()#再关闭数据库连接

print('创建pythonBD数据库成功')

创建表

代码示例:

import pymysql

#打开数据库连接

conn = pymysql.connect('localhost',user = "root", passwd =

"123456",db = "testdb")

#获取游标

cursor=conn.cursor()

print(cursor)

#创建user表

cursor.execute('drop table if exists user')

sql="""CREATE TABLE IF NOT EXISTS `user` (

`id` int(11) NOT NULL

AUTO_INCREMENT,

`name` varchar(255) NOT

NULL,

`age` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT

CHARSET=utf8 AUTO_INCREMENT=0"""

cursor.execute(sql)

cursor.close()#先关闭游标

conn.close()#再关闭数据库连接

print('创建数据表成功')

插入单条数据

代码示例:

'''插入单条数据'''

import pymysql

#打开数据库连接,不指定数据库

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

cur=conn.cursor()#获取游标

#创建user表

cur.execute('drop table if exists user')

sql="""CREATE TABLE IF NOT EXISTS `user` (

`id` int(11) NOT NULL

AUTO_INCREMENT,

`name` varchar(255) NOT

NULL,

`age` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT

CHARSET=utf8 AUTO_INCREMENT=0"""

cur.execute(sql)

insert=cur.execute("insert into user values(1,'tom',18)")

print('添加语句受影响的行数:',insert)

#另一种插入数据的方式,通过字符串传入值

sql="insert into user values(%s,%s,%s)"

cur.execute(sql,(3,'kongsh',20))

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

批量插入多条数据

代码示例:

'''插入多条数据'''

import pymysql

#打开数据库连接,不指定数据库

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

#获取游标

cur=conn.cursor()

#另一种插入数据的方式,通过字符串传入值

sql="insert into user values(%s,%s,%s)"

insert=cur.executemany(sql,[(4,'wen',20),(5,'tom',10),(6,'test',30)])

print ('批量插入返回受影响的行数:',insert)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

注意:批量插入多条sql语句采用的是executemany(sql,args)函数,返回受影响的行数。args参数是一个包含多个元组的列表,每个元组对应一条mysql中的一条数据。这里的%s不需要加引号,否则插入数据的数据会类型错误

查询数据

使用execute()函数得到的只是受影响的行数,并不能真正拿到查询的内容。cursor对象还提供了3种提取数据的方法:fetchone、fetchmany、fetchall.。每个方法都会导致游标动,所以必须注意游标的位置。

cursor.fetchone():获取游标所在处的一行数据,返回元组,没有返回None

cursor.fetchmany(size):接受size行返回结果行。如果size大于返回的结果行的数量,则会返回cursor.arraysize条数据。

cursor. fetchall():接收全部的返回结果行。

代码示例:fetchone

'''fetchone'''

import pymysql

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

#获取游标

cur=conn.cursor()

cur.execute("select * from user;")

while 1:

res=cur.fetchone()

if res is

None:

#表示已经取完结果集

break

print

(res)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

注意:从execute()函数的查询结果中取数据,以元组的形式返回游标所在处的一条数据,如果游标所在处没有数据,将返回空元组,该数据执行一次,游标向下移动一个位置。fetchone()函数必须跟exceute()函数结合使用,并且在exceute()函数之后使用

代码示例:fetchmany

‘’‘fetchmany’’’

import pymysql

#打开数据库连接

conn=pymysql.connect(‘localhost’,‘root’,‘123456’)

conn.select_db(‘pythondb’)

#获取游标

cur=conn.cursor()

cur.execute(“select * from user”)

#取3条数据

resTuple=cur.fetchmany(3)

print(type(resTuple))

for res in resTuple:

print (res)

cur.close()

conn.commit()

conn.close()

print(‘sql执行成功’)

注意:从exceute()函数结果中获取游标所在处的size条数据,并以元组的形式返回,元组的每一个元素都也是一个由一行数据组成的元组,如果size大于有效的结果行数,将会返回cursor.arraysize条数据,但如果游标所在处没有数据,将返回空元组。查询几条数据,游标将会向下移动几个位置。fetmany()函数必须跟exceute()函数结合使用,并且在exceute()函数之后使用

代码示例:fetchall

‘’‘fetchall’’’

import pymysql

#打开数据库连接

conn=pymysql.connect(‘localhost’,‘root’,‘123456’)

conn.select_db(‘pythondb’)

#获取游标

cur=conn.cursor()

cur.execute(“select * from user”)

#取所有数据

resTuple=cur.fetchall()

print(type(resTuple))

print (‘共%d条数据’%len(resTuple))

cur.close()

conn.commit()

conn.close()

print(‘sql执行成功’)

注意:获取游标所在处开始及以下所有的数据,并以元组的形式返回,元组的每一个元素都也是一个由一行数据组成的元组,如果游标所在处没有数据,将返回空元组。执行完这个方法后,游标将移动到数据库表的最后

更新数据

代码示例:更新单条数据

'''更新单条数据'''

import pymysql

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

#获取游标

cur=conn.cursor()

#更新一条数据

update=cur.execute("update user set age=100 where

name='kongsh'")

print ('修改后受影响的行数为:',update)

#查询一条数据

cur.execute(select * from user where name="kongsh";')

print(cur.fetchone())

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

代码示例:更新多条数据

'''更新多条数据'''

import pymysql

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

#获取游标

cur=conn.cursor()

#更新前查询所有数据

cur.execute("select * from user where name in

('kongsh','wen');")

print('更新前的数据为:')

for res in cur.fetchall():

print (res)

print

('*'*40) #更新2条数据

sql="update user set age=%s where name=%s"

update=cur.executemany(sql,[(15,'kongsh'),(18,'wen')])

#更新2条数据后查询所有数据

cur.execute("select * from user where name in

('kongsh','wen');")

print('更新后的数据为:')

for res in cur.fetchall():

print (res)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

删除数据

代码示例:删除单条数据

'''删除单条数据'''

import pymysql

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

#获取游标

cur=conn.cursor()

#删除前查询所有数据

cur.execute("select * from user;")

print('删除前的数据为:')

for res in cur.fetchall():

print (res)

print

('*'*40) #删除1条数据

cur.execute("delete from user where id=1")

#删除后查询所有数据

cur.execute("select * from user;")

print('删除后的数据为:')

for res in cur.fetchall():

print (res)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

代码示例:删除多条数据

'''删除多条数据'''

import pymysql

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

#获取游标

cur=conn.cursor()

#删除前查询所有数据

cur.execute("select * from user;")

print('删除前的数据为:')

for res in cur.fetchall():

print (res)

print

('*'*40) #删除2条数据

sql="delete from user where id=%s"

cur.executemany(sql,[(3),(4)])

#删除后查询所有数据

cur.execute("select * from user;")

print('删除后的数据为:')

for res in cur.fetchall():

print (res)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

事务回滚

代码示例:’’‘事务回滚’’'

import pymysql

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('pythondb')

#获取游标

cur=conn.cursor()

#修改前查询所有数据

cur.execute("select * from user;")

print('修改前的数据为:')

for res in cur.fetchall():

print (res)

print

('*'*40) #更新表中第1条数据

cur.execute("update user set name='xiaoxiaoxiaoxiaoren' where

id=5")

#修改后查询所有数据

cur.execute("select * from user;")

print('修改后的数据为:')

for res in cur.fetchall():

print (res)

print ('*'*40)

#回滚事务

conn.rollback()

cur.execute("select * from user;")

print('回滚事务后的数据为:')

for res in cur.fetchall():

print (res)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

练习:插入100条数据到数据库

代码示例:每次插入一条

'''插入100条数据到数据库(每次插入一条)'''

import pymysql

import string,random

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('testdb')

#获取游标

cur=conn.cursor()

#创建user表

cur.execute('drop table if exists user')

sql="""CREATE TABLE IF NOT EXISTS `user` (

`id` int(11) NOT NULL

AUTO_INCREMENT,

`name` varchar(255) NOT

NULL,

`age` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT

CHARSET=utf8 AUTO_INCREMENT=0"""

cur.execute(sql)

#修改前查询所有数据

cur.execute("select * from user;")

print('修改前的数据为:')

for res in cur.fetchall():

print (res)

print

('*'*40) #循环插入数据

words=list(string.ascii_letters)

sql="insert into user values(%s,%s,%s)"

for i in range(100):

random.shuffle(words)#打乱顺序

cur.execute(sql,(i+1,"".join(words[:5]),random.randint(0,80)))

#插入100条后查询所有数据

cur.execute("select * from user;")

print('修改后的数据为:')

for res in cur.fetchall():

print (res)

print ('*'*40)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

代码示例:一次插入多条

'''插入100条数据到数据库(一次插入多条)'''

import pymysql

import string,random

#打开数据库连接

conn=pymysql.connect('localhost','root','123456')

conn.select_db('testdb')

#获取游标

cur=conn.cursor()

#创建user表

cur.execute('drop table if exists user')

sql="""CREATE TABLE IF NOT EXISTS `user` (

`id` int(11) NOT NULL

AUTO_INCREMENT,

`name` varchar(255) NOT

NULL,

`age` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT

CHARSET=utf8 AUTO_INCREMENT=0"""

cur.execute(sql)

#修改前查询所有数据

cur.execute("select * from user;")

print('修改前的数据为:')

for res in cur.fetchall():

print (res)

print

('*'*40) #循环插入数据

words=list(string.ascii_letters)

sql="insert into user values(%s,%s,%s)"

random.shuffle(words)#打乱顺序

cur.executemany(sql,[(i+1,"".join(words[:5]),random.randint(0,80))

for i in range(100) ])

#插入100条后查询所有数据

cur.execute("select * from user;")

print('修改后的数据为:')

for res in cur.fetchall(): print (res)

print ('*'*40)

cur.close()

conn.commit()

conn.close()

print('sql执行成功')

********************************************

使用python操作mysql数据库

PyMySQL的安装:pip install PyMySQL

python连接数据库

import pymysql

db = pymysql.connect("数据库ip","用户","密码","数据库" ) # 打开数据库连接

cursor.execute("SELECT

VERSION()") # 使用 execute() 方法执行 SQL 查询

data =

cursor.fetchone() # 使用 fetchone() 方法获取单条数据

print ("Database version : %s " % data)

db.close() # 关闭数据库连接

import pymysql

conn = pymysql.connect( host='localhost', user='root', password

="root", database='db', port=3306, charset= 'utf-8', )

cur = conn.cursor(cursor=pymysql.cursors.DictCursor)

创建表操作

import pymysql

db = pymysql.connect("localhost","testuser","test123", "TESTDB"

) # 打开数据库连接

cursor = db.cursor() # 使用

cursor() 方法创建一个游标对象 cursor

cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# 使用 execute() 方法执行SQL,如果表存在则删除

sql = """CREATE TABLE EMPLOYEE (

FIRST_NAME CHAR(20) NOT NULL,

LAST_NAME CHAR(20),

AGE INT, SEX CHAR(1),

INCOME FLOAT )"""

#

使用预处理语句创建表

cursor.execute(sql)

db.close() #

关闭数据库连接

操作数据

插入操作

import pymysql

# 打开数据库连接

db = pymysql.connect("localhost","testuser","test123", "TESTDB"

)

# 使用cursor()方法获取操作游标

cursor = db.cursor()

# SQL 插入语句

sql = """INSERT INTO EMPLOYEE(FIRST_NAME,

LAST_NAME, AGE, SEX, INCOME)

VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""

try:

cursor.execute(sql) #

执行sql语句

db.commit() # 提交到数据库执行

except:

db.rollback() # 如果发生错误则回滚

# 关闭数据库连接

db.close()

import pymysql

# 打开数据库连接

db = pymysql.connect("localhost","testuser","test123", "TESTDB"

) # 使用cursor()方法获取操作游标

cursor = db.cursor()

# SQL 插入语句

sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \

LAST_NAME, AGE, SEX, INCOME) \

VALUES (%s, %s, %s, %s, %s )" % \

('Mac', 'Mohan', 20, 'M', 2000)

try:

cursor.execute(sql) # 执行sql语句

db.commit() # 执行sql语句

except:

db.rollback() # 发生错误时回滚

# 关闭数据库连接

db.close()

查询操作

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

fetchone(): 该方法获取下一个查询结果集。结果集是一个对象

fetchall(): 接收全部的返回结果行.

rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

import pymysql

# 打开数据库连接

db = pymysql.connect("localhost","testuser","test123", "TESTDB"

)

# 使用cursor()方法获取操作游标

cursor = db.cursor()

# SQL 查询语句

sql = "SELECT * FROM EMPLOYEE \

WHERE INCOME > %s" % (1000)

try: cursor.execute(sql)#

执行SQL语句

results = cursor.fetchall()#

获取所有记录列表

for row in results:

fname = row[0]

lname = row[1]

age = row[2]

sex = row[3]

income = row[4]

# 打印结果

print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \ (fname,

lname, age, sex, income ))

except:

print ("Error: unable to fetch

data")

# 关闭数据库连接

db.close()

更新操作

import pymysql

# 打开数据库连接

db = pymysql.connect("localhost","testuser","test123", "TESTDB"

)

# 使用cursor()方法获取操作游标

cursor = db.cursor()

# SQL 更新语句

sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" %

('M')

try:

cursor.execute(sql) # 执行SQL语句

db.commit() # 提交到数据库执行

except

db.rollback() # 发生错误时回滚

# 关闭数据库连接

db.close()

删除操作

import pymysql

# 打开数据库连接

db = pymysql.connect("localhost","testuser","test123", "TESTDB"

)

# 使用cursor()方法获取操作游标

cursor = db.cursor()

# SQL 删除语句

sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)

try

cursor.execute(sql) # 执行SQL语句

db.commit() # 提交修改

except

db.rollback() # 发生错误时回滚

# 关闭连接

db.close()

数据备份

数据库的逻辑备份

#语法:

# mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql

#示例:

#单库备份

mysqldump -uroot -p123 db1 > db1.sql

mysqldump -uroot -p123 db1 table1 table2 >

db1-table1-table2.sql

#多库备份

mysqldump -uroot -p123 --databases db1 db2 mysql db3 >

db1_db2_mysql_db3.sql

#备份所有库

mysqldump -uroot -p123 --all-databases > all.sql

数据恢复

#方法一:

[root@egon backup]# mysql -uroot -p123 < /backup/all.sql

#方法二:

mysql> use db1;

mysql> SET SQL_LOG_BIN=0; #关闭二进制日志,只对当前session生效

mysql> source /root/db1.sql

事务和锁

begin; # 开启事务

select * from emp where id = 1 for update; #

查询id值,for update添加行锁;

update emp set salary=10000 where id = 1; # 完成更新

commit; # 提交事务