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数据库的读写

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容