Python Mysql数据库基础

在python的使用中,我们不可避免需要使用数据库来完成数据的存储操作。python基于庞大的库,能过轻松进行数据库的使用以及表的各类操作。

数据库的连接

进行mysql数据库的连接,我们需要python库的支持,输入:

pip install mysql.connector

来安装python的mysql连接库

之后,通过:

import mysql.connector

mydb = mysql.connector.connect(
host="localhost", #默认用主机名
user="root", #默认用户名
password="123456" #mysql密码
,charset='utf8' #编码方式
)

来完成数据库的连接

表的创建

当我们完成数据库的连接后就可以实现简单的数据库操作,比如创建表

在这之前,我们使用connect方法连接了数据库,创建的连接对象mydb,之后我们需要使用cursor()方法来创建操作对象,并使用execute()方法来执行操作。


import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",  # 默认用主机名
    user="root",  # 默认用户名
    password="123456",  # mysql密码
    charset='utf8',  # 编码方式
    database="chuan"  # 数据库名称
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE user (name VARCHAR(255), address VARCHAR(255))")

之后使用

mycursor.execute("SHOW TABLES")
for x in mycursor:
    print(x)

来查看表是否存在

表的插入

如同平时的sql语句,python也使用insert into 语句来完成数据插入

单数据插入

在创建好数据库操作对象之后,我们可以通过定义sql语句对象和内容填充元组val,如下:

import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",  # 默认用主机名
    user="root",  # 默认用户名
    password="123456",  # mysql密码
    charset='utf8',  # 编码方式
    database="chuan"  # 数据库名称
)

mycursor = mydb.cursor()

sql = "INSERT INTO user (name, address) VALUES (%s, %s)" #sql语句
val = ("川川", "上海交大") #插入的元组
mycursor.execute(sql, val) #执行语句

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

print(mycursor.rowcount, "添加表格成功.") #打印更新数据数量和信息

需要注意的是,当数据库内容存在变化,需要执行数据库连接对象的commit()方法来更新连接对象。

当需要插入多个数据时

我们可以使用数组来包含元组使用executemany()方法来执行语句


import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",  # 默认用主机名
    user="root",  # 默认用户名
    password="123456",  # mysql密码
    charset='utf8',  # 编码方式
    database="chuan"  # 数据库名称
)

mycursor = mydb.cursor()

sql = "INSERT INTO user (name, address) VALUES (%s, %s)"
val = [
  ('Peter', 'Lowstreet 4'),
  ('Amy', 'Apple st 652'),
  ('Hannah', 'Mountain 21'),
  ('Michael', 'Valley 345'),
  ('Sandy', 'Ocean blvd 2'),
  ('Betty', 'Green Grass 1'),
  ('Richard', 'Sky st 331'),
  ('Susan', 'One way 98'),
  ('Vicky', 'Yellow Garden 2'),
  ('Ben', 'Park Lane 38'),
  ('William', 'Central st 954'),
  ('Chuck', 'Main Road 989'),
  ('Viola', 'Sideway 1633')
]

mycursor.executemany(sql, val)

mydb.commit()

print(mycursor.rowcount, "全部添加成功.")

如果不存在这个表,会报错。

获取插入的id

使用 获取操作对象的lastrowid来获取id

print("记录一个插入的id:", mycursor.lastrowid)

当然被插入的表的id必须是AUTO_INCREMENT,cursor.lastrowid才能获取到id值,因为只有自动创建的id才能获取id值。

如果插入多行数据,则返回最后插入行的id

数据选择

使用select语句来对数据进行选择(详细见sql语句语法)

我们使用操作对象的 fetchall()方法来获取一个结果对象(fetchall表示获取选择的所有记录),如下:

import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",  # 默认用主机名
    user="root",  # 默认用户名
    password="123456",  # mysql密码
    charset='utf8',  # 编码方式
    database="chuan"  # 数据库名称
)

mycursor = mydb.cursor()

mycursor.execute("SELECT name FROM user")

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

for x in myresult:
  print(x)

如果只对一行感兴趣,则可以使用fetchone()方法,该方法只返回结果的第一行:

import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",  # 默认用主机名
    user="root",  # 默认用户名
    password="123456",  # mysql密码
    charset='utf8',  # 编码方式
    database="chuan"  # 数据库名称
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM user")

myresult = mycursor.fetchone()

print(myresult)

防止sql注入

当通过查询值是,应该对这些值进行转义,使用 %s占位符来转义查询值:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",  # 默认用主机名
    user="root",  # 默认用户名
    password="123456",  # mysql密码
    charset='utf8',  # 编码方式
    database="chuan"  # 数据库名称
)

mycursor = mydb.cursor()

sql = "SELECT * FROM user WHERE address = %s" #这里进行了转义
adr = ("Yellow Garden 2", )

mycursor.execute(sql, adr)

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

数据更新

数据更新方法同理:

import mysql.connector

mydb = mysql.connector.connect(
    host="localhost",  # 默认用主机名
    user="root",  # 默认用户名
    password="123456",  # mysql密码
    charset='utf8',  # 编码方式
    database="chuan"  # 数据库名称
)

mycursor = mydb.cursor()

sql = "UPDATE user SET address = %s WHERE address = %s"
val = ("Valley 345", "Canyon 123")

mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "更新成功")

依然需要commit方法来更新连接对象。