python下对mysql数据库的链接操作

参考网址:

https://blog.csdn.net/guofeng93/article/details/53994112


https://blog.csdn.net/Chen_Eris/article/details/81475549


https://blog.csdn.net/weixin_40475396/article/details/79036838



python 操作数据库,可以使用pymysql包


pycharm——file——settings——点击“+”号,输入'pymsql'——点击install


(一)、首先导入pymysql

import pymysql


(二)、建立连接

#import mysql.connector

mydb = mysql.connector.connect(
       host="localhost",                  # 数据库主机地址
       port=3306,                          # 端口号
       user="root",                       # 数据库用户名
       passwd="123",                      # 数据库密码
       database="runoob_db",              # 使用这个数据库
       charset="utf8"                     # 连接编码
)

mycursor = mydb.cursor()



(三)、执行数据操作

import mysql.connector

mydb = mysql.connector.connect(
       host="localhost",                  # 数据库主机地址
       port=3306,                          # 端口号
       user="root",                       # 数据库用户名
       passwd="123",                      # 数据库密码
       database="runoob_db",              # 使用这个数据库
       charset="utf8"                     # 连接编码
)

mycursor = mydb.cursor()

mycursor.execute("show tables")

print("建表语句执行前,目前runoob_db数据库里面包含的表:")

for x in mycursor:             #打印sql语句执行的结果
    print(x)

#--------------------------------------------------------------------------------------------------------------------------

mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")  #创建一个表

print("建表语句执行后:")

mycursor.execute("show tables")

print("目前runoob_db数据库里面包含的表:")

for x in mycursor:             #打印sql语句执行的结果
    print(x)


执行结果:
建表语句执行前,目前runoob_db数据库里面包含的表:
建表语句执行后:
目前runoob_db数据库里面包含的表:
('sites',)

================================================================================================
================================================================================================
================================================================================================
================================================================================================
================================================================================================
================================================================================================

插入数据:

import mysql.connector

mydb = mysql.connector.connect(
       host="localhost",                  # 数据库主机地址
       port=3306,                          # 端口号
       user="root",                       # 数据库用户名
       passwd="123",                      # 数据库密码
       database="runoob_db",              # 使用这个数据库
       charset="utf8"                     # 连接编码
)

mycursor = mydb.cursor()

#sql写入第一条语句

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"

val = ("RUNOOB", "https://www.runoob.com")

mycursor.execute(sql, val)                                #单条执行语句的方法

mydb.commit()            #数据又更新必须要用commit方法

#------------------------------------------------------------
#------------------------------------------------------------

mycursor.execute("select * from sites")

for x in mycursor:             #打印sql语句执行的结果
    print(x)



-------------------------------------------------------------------------------------------


import mysql.connector

mydb = mysql.connector.connect(
       host="localhost",                  # 数据库主机地址
       port=3306,                          # 端口号
       user="root",                       # 数据库用户名
       passwd="123",                      # 数据库密码
       database="runoob_db",              # 使用这个数据库
       charset="utf8"                     # 连接编码
)
mycursor = mydb.cursor()

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
  ('Google', 'https://www.google.com'),
  ('Github', 'https://www.github.com'),
  ('Taobao', 'https://www.taobao.com'),
  ('stackoverflow', 'https://www.stackoverflow.com/')
]

mycursor.executemany(sql, val)                 #批量写入数据的方法

mydb.commit()    # 数据表内容有更新,必须使用到该语句

===================================================================================

目前表里总共有5条数据,


关于对数据的操作方法如下:


(1)callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
。

(2)execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
。

(3)executemany(self, query, args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
。

(4)nextset(self):移动到下一个结果集
 ?

(5)fetchmany(self,?size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据。

(6)fetchone(self):返回一条结果行。

(7)cursor用来接收返回值的方法。

(8)fetchall(self):接收全部的返回结果行。

=================================================================================================================================

mydb为示例创建的连接对象

连接对象的mydb.close()方法可关闭数据库连接,并释放相关资源。



连接对象的mydb.cursor([cursorClass])方法返回一个指针对象,用于访问和操作数据库中的数据。




连接对象的mydb.begin()方法用于开始一个事务,如果数据库的AUTOCOMMIT已经开启就关闭它,直到事务调用commit()和rollback()结束。


连接对象的mydb.commit()和db.rollback()方法分别表示事务提交和回退。


指针对象的cursor.close()方法关闭指针并释放相关资源。




指针对象的cursor.execute(query[,parameters])方法执行数据库查询。


指针对象的cursor.fetchall()可取出指针结果集中的所有行,返回的结果集一个元组(tuples)。


指针对象的cursor.fetchmany([size=cursor.arraysize])从查询结果集中取出多行,我们可利用可选的参数指定取出的行数。


指针对象的cursor.fetchone()从查询结果集中返回一行。


指针对象的cursor.arraysize属性指定由cursor.fetchmany()方法返回行的数目,影响fetchall()的性能,默认值为1。


指针对象的cursor.rowcount属性指出上次查询或更新所发生行数。-1表示还没开始查询或没有查询到数据。

============================================================================================================

fetchone():返回结果集的一行(row对象),无数据时返回none


fetchall():返回结果集的所有行(row对象列表),无数据返回空list


fetchmany():返回结果集的多行(row对象列表),无数据返回空list


-----------------------------------------------------------------------------


print(mycursor.fetchmany(1))   #  返回结果集的一条数据

print(mycursor.fetchmany(2))   #  返回结果集的两条数据


================================================================================================
================================================================================================
================================================================================================
================================================================================================
================================================================================================
================================================================================================

file——>settings——>新窗口点击+号  然后输入pymysql——>点击 install


==================================================================================
==================================================================================

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
)

mycursor = mydb.cursor()


print(mydb)                       #查看数据库是否连接成功




执行结果:

<mysql.connector.connection.MySQLConnection object at 0x02691FE8>

#---------------------------------------------------------------------------------------------

mycursor.execute("SHOW DATABASES")    #查询所有的数据库名称,并打印出来
for x in mycursor:
  print(x)


执行结果:

('information_schema',)
('mysql',)
('performance_schema',)
('test',)


#---------------------------------------------------------------------------------------------

mycursor.execute("CREATE DATABASE runoob_db")    #新建一个数据库,名称为:runoob_db

#---------------------------------------------------------------------------------------------

mycursor.execute("SHOW DATABASES")    #查询所有的数据库名称,并打印出来
for x in mycursor:
  print(x)


执行结果:

('information_schema',)
('mysql',)
('performance_schema',)
('runoob_db',)
('test',)


==================================================================================
==================================================================================

选择一个数据库,进入数据库之后进行操作:


创建数据表


创建数据表使用 "CREATE TABLE" 语句,创建数据表前,需要确保数据库已存在,以下创建一个名为 sites 的数据表:


在创建之前,先查看这个表是否存在


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                            # 数据库用户名
  passwd="123",                               # 数据库密码
  database="runoob_db"                                    #使用这个数据库
)

mycursor = mydb.cursor()

mycursor.execute("SHOW TABLES")

for x in mycursor:
  print(x)


执行结果:



-----<返回为空> 说明不存在


==================================================================================
==================================================================================


建立表:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")


-------------------------------------------------------------------------------------

创建表的时候我们一般都会设置一个主键(PRIMARY KEY),我们可以使用 "INT AUTO_INCREMENT PRIMARY KEY" 语句来创建一个主键,主键起始值为 1,逐步递增。

如果我们的表已经创建,我们需要使用 ALTER TABLE 来给表添加主键:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")


###################################################################################################


如果你还未创建 sites 表,可以直接使用以下代码创建。



import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")



###################################################################################################


==================================================================================
==================================================================================


插入数据


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"

val = ("RUNOOB", "https://www.runoob.com")


mycursor.execute(sql, val)

mydb.commit()    # 数据表内容有更新,必须使用到该语句

mycursor.execute("")

print(mycursor.rowcount, "记录插入成功。")




执行结果:


1 记录插入成功。

-------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------

批量插入


批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
  ('Google', 'https://www.google.com'),
  ('Github', 'https://www.github.com'),
  ('Taobao', 'https://www.taobao.com'),
  ('stackoverflow', 'https://www.stackoverflow.com/')
]

mycursor.executemany(sql, val)

mydb.commit()    # 数据表内容有更新,必须使用到该语句

print(mycursor.rowcount, "记录插入成功。")


执行结果:

4 记录插入成功。

---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------

如果我们想在数据记录插入后,获取该记录的 ID ,可以使用以下代码:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("Zhihu", "https://www.zhihu.com")
mycursor.execute(sql, val)

mydb.commit()

print("1 条记录已插入, ID:", mycursor.lastrowid)


执行结果:


1 条记录已插入, ID: 6


=======================================================================================
=======================================================================================
=======================================================================================


查询数据


查询数据使用 SELECT 语句:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM sites")

myresult = mycursor.fetchall()     # fetchall() 获取所有记录

for x in myresult:
  print(x)


执行结果:


(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')


--------------------------------------------------------------------

--------------------------------------------------------------------


也可以读取指定的字段数据:



import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT name, url FROM sites")

myresult = mycursor.fetchall()

for x in myresult:
  print(x)


执行结果:

('RUNOOB', 'https://www.runoob.com')
('Google', 'https://www.google.com')
('Github', 'https://www.github.com')
('Taobao', 'https://www.taobao.com')
('stackoverflow', 'https://www.stackoverflow.com/')
('Zhihu', 'https://www.zhihu.com')

---------------------------------------------------------------------

如果我们只想读取一条数据,可以使用 fetchone() 方法:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM sites")

myresult = mycursor.fetchone()

print(myresult)


执行结果:

(1, 'RUNOOB', 'https://www.runoob.com')

==============================================================================
==============================================================================

where 条件语句


如果我们要读取指定条件的数据,可以使用 where 语句:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM sites WHERE name ='RUNOOB'"

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)


执行结果:


(1, 'RUNOOB', 'https://www.runoob.com')

---------------------------------------------------------------------

也可以使用通配符 %import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM sites WHERE url LIKE '%oo%'"

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)


执行结果:


(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')


-----------------------------------------------------------------------------------------------


为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义查询的条件:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM sites WHERE name = %s"
na = ("RUNOOB", )

mycursor.execute(sql, na)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)


执行结果:


(1, 'RUNOOB', 'https://www.runoob.com')


======================================================================
======================================================================


排序

查询结果排序可以使用 ORDER BY 语句,默认的排序方式为升序,关键字为 ASC,如果要设置降序排序,可以设置关键字 DESC。

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM sites ORDER BY id asc"

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

执行结果:

(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')


---------------------------------------------------------------------------


降序排序实例:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM sites ORDER BY id desc"

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

执行结果:


(6, 'Zhihu', 'https://www.zhihu.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(4, 'Taobao', 'https://www.taobao.com')
(3, 'Github', 'https://www.github.com')
(2, 'Google', 'https://www.google.com')
(1, 'RUNOOB', 'https://www.runoob.com')


----------------------------------------------------------------------------

------------------------------------------------------------------------------

Limit

如果我们要设置查询的数据量,可以通过 "LIMIT" 语句来指定

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "SELECT * FROM sites "

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

执行结果:


(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')


--------------------------------------------------------------------------------


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM sites LIMIT 3")

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

执行结果:

(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')

---------------------------------------------------------------------------------

也可以指定起始位置,使用的关键字是 OFFSET:  从第二条开始读取前 3 条记录:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1")  # 0 为 第一条,1 为第二条,以此类推

myresult = mycursor.fetchall()

for x in myresult:
  print(x)


执行结果:


(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')


=============================================================================================================

=============================================================================================================

=============================================================================================================


删除记录

删除记录使用 "DELETE FROM" 语句:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "DELETE FROM sites WHERE name = 'stackoverflow'"

mycursor.execute(sql)

mydb.commit()

print(mycursor.rowcount, " 条记录删除")



执行结果:

1  条记录删除

----------------------------------------------------------------------------


注意:要慎重使用删除语句,删除语句要确保指定了 WHERE 条件语句,否则会导致整表数据被删除。

为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义删除语句的条件:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "DELETE FROM sites WHERE name = %s"
na = ("stackoverflow", )

mycursor.execute(sql, na)

mydb.commit()

print(mycursor.rowcount, " 条记录删除")


执行结果:


0  条记录删除

==========================================================================

===============================================================================


更新表数据


数据表更新使用 "UPDATE" 语句:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "UPDATE sites SET name = 'ZH' WHERE name = 'Zhihu'"

mycursor.execute(sql)

mydb.commit()

print(mycursor.rowcount, " 条记录被修改")

执行结果:

1  条记录被修改


---------------------------------------------------------------------------


注意:UPDATE 语句要确保指定了 WHERE 条件语句,否则会导致整表数据被更新。

为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义更新语句的条件:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "UPDATE sites SET name = %s WHERE name = %s"
val = ("Zhihu", "ZH")

mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, " 条记录被修改")


执行结果:


1  条记录被修改


==================================================================

==========================================================================


删除表


删除表使用 "DROP TABLE" 语句, IF EXISTS 关键字是用于判断表是否存在,只有在存在的情况才删除:


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",                  # 数据库主机地址
  user="root",                       # 数据库用户名
  passwd="123",                      # 数据库密码
  database="runoob_db"
)

mycursor = mydb.cursor()

sql = "DROP TABLE IF EXISTS sites"       # 删除数据表 sites

mycursor.execute(sql)

mydb.commit()
=======================================================================================================================
posted @ 2019-12-10 21:16  小白龙白龙马  阅读(402)  评论(0编辑  收藏  举报