Python操作mysql数据库的两种方式

一、使用pymsql库

pymysql是Python操作MySQL数据库的模块。

import pymysql

使用pymysql的connect()方法建立与mysql数据库的连接:conn=pymsql.connect()

connect方法的主要参数如下:
host:连接的mysql主机,如果本机是'localhost';IP地址
port:连接的mysql主机的端口,默认是3306
db:数据库的名称
user:连接的用户名
password:连接的密码
charset:通信采用的编码方式,要求与数据库创建时指定的编码一致,否则中文会乱码

connect方法返回的conn是一个Connection对象

Connection对象拥有如下方法:
close()关闭连接
commit()事务,提交之前的操作,使生效!
rollback()事务,放弃之前的操作
cursor()返回Cursor对象,用于执行sql语句并获得结果。Cursor:游标对象
注意:pymysql操作数据库默认开启事物功能


调用Connection对象的cursor()方法,返回Cursor对象,然后就可以执行sql语句,操作数据库。
cursor=conn.cursor() # 返回是元组形式的数据(默认)
cursor = conn.cursor( cursor=pymysql.cursors.DictCursor ) # 指定返回字典形式的数据

Cursor对象的方法:
close():关闭游标
execute(operation [, parameters ]):执行sql语句,返回受影响的行数。
##########################################
按照游标的位置往后取值,游标默认位置:0
fetchone():执行查询语句时,获取查询结果集的第一个行数据,返回一个元组。
fetchmany(n):执行查询语句时,获取查询结果集的N行数据。
fetchall():执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回。
##########################################
控制游标的位置:
scroll(value[,mode]):将游标移动到某个位置
mode表示移动的方式:relative(默认)或absolute。
mode的默认值为relative,表示基于当前行位置移动到value,value为正,则向下移动,value为负,则向上移动。
mode的值为absolute,表示基于第一条数据的位置,第一条数据的位置为0。

Cursor对象的属性:
rowcount:只读属性,表示最近一次execute()执行后受影响的行数
connection:获得当前连接对象

示例代码:

import pymysql

param = {
    'host':'localhost',
    'port':3306,
    'db':'tp',
    'user':'root',
    'password':'dao0206',
    'charset':'utf8',
}
conn = pymysql.connect(**param)   #连接对象
cur = conn.cursor()   #游标对象,采用默认的数据格式

cur.execute("SELECT * FROM test")   #执行sql语句,返回受影响的行数
cur.fetchall()   #获取查询结果

# %s:占位符
# params:增加内容的列表或元组,多条语句可以使用嵌套
sql = "insert into test values(%s,%s)"
params = (1221,"小强")
cur.execute(sql, params)   #sql语句参数化,防止攻击!

# pymysql连接数据库默认开启事物,提交之前的操作,使生效!
conn.commit()

# 要及时关闭连接!
cur.close()  #关闭游标
conn.close()  #关闭连接

注意:
虽然可以使用cur.execute执行create table等语句
但建议在开发之初,就创建好数据库表结构,然后再将数据追加到表中。


二、使用pandas库

pandas的DataFrame数据格式与数据库中的表非常相似,使用pandas来操作数据库非常方便,特别是数据较大时。
使用pandas中的read_sql和to_sql函数可以便捷的从数据库中读写数据,下面以mysql数据库为例。

1. read_sql函数:主要用于从数据库中读取数据,可以执行sql语句或直接读取整张表。

主要参数:

  • sql:sql语句 或 数据库表名
  • con:数据库连接引擎
  • index_col:将某列设置为索引,默认None
  • parse_dates :将列解析为日期格式,列表或字典
  • columns:需要选取的列(当sql参数为表名时)
  • chunksize:指定每次迭代返回的块大小(返回的是迭代器)

2. to_sql函数:主要用于将dataframe数据写入数据库。

主要参数:

  • name :数据库的表名
  • con:数据库连接引擎
  • if_exists:三种模式{“fail”,“replace”,"append"}。fail(默认):若表存在,引发一个ValueError;replace:若表存在,覆盖原来表内数据;append:若表存在,将数据写到原表数据的后面。
  • index:是否将DataFrame的index单独写到一列中,默认为“True”。
  • index_label:当index为True时,指定列标签。
  • chunksize:批处理的大小,迭代写入。
  • dtype:指定列的数据类型,字典形式存储{column_name: sql_dtype}。常见数据类型是sqlalchemy.types.INT()和sqlalchemy.types.CHAR(length=x)。注意:INT和CHAR都需要大写,INT()不用指定长度。

3. con参数:数据库连接引擎
python的sqlalchemy模块提供了create_engine()函数用来初始化数据库连接(默认不开启事物功能),sqlalchemy用一个字符串表示连接信息:'数据库名+数据库驱动://用户名:口令@ip地址:端口号/数据库名?charset=utf8'

主要参数:

  • 数据库名:mysql,postgresql,oracle,sqlite等。
  • 数据库驱动:用于连接数据库的DBAPI的名字,mysql数据库使用的就是pymysql,如果这一项不指定,将使用默认的DBAPI。

4. 示例代码:

import pandas as pd
from sqlalchemy import create_engine

# 数据库连接引擎
engine = create_engine('mysql+pymysql://root:passwd@localhost:3306/database?charset=utf8', encoding='utf-8')

####### 读 #######
sql = ''' select name age from student where gender='男'; '''    # sql查询语句
df = pd.read_sql(sql, con = engine)    #执行sql语句,读取数据
print(type(df), df)   #输出dataframe数据

####### 写 #######
df = pd.DataFrame({'id': [1, 2, 3, 4], 'name': ['zhangsan', 'lisi', 'wangwu', 'zhuliu']})
df.to_sql('test', engine, if_exists='append')   #将dataframe数据最加到数据库test表
print("Write to MySQL successfully!")

另外:engine.execute(sql)可以直接执行sql语句

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:passwd@localhost:3306/database?charset=utf8', encoding='utf-8')
sql = "DROP TABLE IF EXISTS test"
engine.execute(sql)

sql = "SELECT * FROM test"
result = engine.execute(sql).fetchall() 
print(result)   #返回一个列表,列表中的每个元组都是一条记录。

参考文献:
Python操作MySQL数据库的两种方式pymysql和pandas
Python之使用Pandas库实现MySQL数据库的读写

你可能感兴趣的:(Python操作mysql数据库的两种方式)