一、使用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数据库的读写