使用Python与数据库交互
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 18 19:25:01 2018 @author: wangm
""" # 使用Python自带的sqlite3模块
# 创建数据库中的表、在表中插入数据、以及在输出中获取数据并对行进行计数
#!/usr/bin/env python3
# 导入sqlite3模块
import sqlite3 # 创建一个代表数据库的连接对象,此处使用专用名词 ':memory:' 在内存中创建一个数据库
# 也可以使用其他名字,此时创建的数据库会被保存在你的工作目录,或者自己指定的路径下
con = sqlite3.connect(':memory:')
#con = sqlite3.connect('mydatabase')
# 创建表sales,具有四个属性
# 此处query内有多行,使用 “”“
query = """create table sales
(customer varchar(20),
product varchar(40),
amount float, date DATE);"""
# 执行query中的sql命令
con.execute(query)
# 将对数据库做的修改提交,即保存到数据库中
con.commit() # 在表中插入四行数据
data = [('AAA', 'Apple', 10000.0, '2018-01-01'),
('BBB', 'Huawei', 5000.0, '2018-02-01'),
('CCC', 'Mi', 3000.0, '2018-03-01')]
# 此处statement只有一行,所以可以用 “
# 此处 ? 为占位符,在connect对象的con.execute()或con.executemany()方法中,需要提供
# 一个包含四个值得元组,元组中的值会按位置替换到sql语句中
# 这种替换的方法还有一个好处是可以防止SQL注入攻击
statement = "insert into sales values(?, ?, ?, ?)"
# 为data中的每条数据元组都执行statement中的命令,此处执行四次
con.executemany(statement, data)
# 注意此处不能用con.execute()方法
# 出错信息:ProgrammingError: Incorrect number of bindings supplied. The current statement uses 4, and there are 3 supplied.
#con.execute(statement, data)
con.commit() # 查询sales表
# 执行SQL语句"select * from sales",并将结果赋给一个光标对象cursor
cursor = con.execute("select * from sales")
# fetchall()取出SQL返回结果的所有行,并将这些行赋给rows
rows = cursor.fetchall()
# rows 的类型 <class 'list'>
#print(type(rows)) # 输出查询到的每一行,并对行计数
#row_counter = 0
#for row in rows:
#print(row)
#row_counter += 1
#print('row_counter is %d' % (row_counter)) """
输出结果:
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('CCC', 'Mi', 3000.0, '2018-03-01')
row_counter is 3
""" # 根据上述的这些对SQL的操作,和前面的关于对CSV文件、Excel文件的操作,就可以很简单的
# 将一个CSV文件或Excel文件存储到数据库中,成为数据库中的一张表
# 以CSV文件为例,即读取CSV文件每一行数据,使用insert,插入到数据库中 # 除了上述的创建数据库、创建表、向表中插入数据、查询表中的数据之外
# 也可以在con.execute()中执行其他的插删改操作 # 插入:
con.execute("insert into sales values(?, ?, ?, ?)", ('DDD', 'MeiZu', 2000.0, '2018-04-01'))
con.commit() cursor = con.execute("select * from sales")
rows = cursor.fetchall()
row_counter = 0
for row in rows:
print(row)
row_counter += 1
print('row_counter is %d' % (row_counter)) # 修改
temp = [2500.0, '2018-05-01', 'DDD']
con.execute("update sales set amount=?, date=? where customer=?;", temp)
con.commit()
cursor = con.execute("select * from sales")
rows = cursor.fetchall()
row_counter = 0
for row in rows:
print(row)
row_counter += 1
print('row_counter is %d' % (row_counter)) # 删除
temp = ['CCC']
con.execute("delete from sales where customer=?;", temp)
con.commit()
cursor = con.execute("select * from sales")
rows = cursor.fetchall()
row_counter = 0
for row in rows:
print(row)
row_counter += 1
print('row_counter is %d' % (row_counter)) """
输出结果:
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('CCC', 'Mi', 3000.0, '2018-03-01')
('DDD', 'MeiZu', 2000.0, '2018-04-01')
row_counter is 4
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('CCC', 'Mi', 3000.0, '2018-03-01')
('DDD', 'MeiZu', 2500.0, '2018-05-01')
row_counter is 4
('AAA', 'Apple', 10000.0, '2018-01-01')
('BBB', 'Huawei', 5000.0, '2018-02-01')
('DDD', 'MeiZu', 2500.0, '2018-05-01')
row_counter is 3 """
上述代码(以Python内置的sqlite为例)展示了如何连接数据库,并在数据库中新建table,并对table进行增删改查操作
而下面在我准备连接MySQL时,出现下列错误:
#!/usr/bin/env python3
import csv
import MySQLdb
#from datetime import datetime, date input_file = 'D:\wangm\Documents\learning\code\python\supplier_data.csv' con = MySQLdb.connect(host='localhost', port=3306, db='test', user='root', passwd='')
c = con.cursor()
"""
file_reader = csv.reader(open(input_file, 'r', newline=''))
header = next(file_reader)
for row in file_reader:
data = []
for column_index in range(len(header)):
data.append(str(row[column_index]).lstrip('$').replace(',', '').strip())
print(data)
c.execute("insert into supplier values (%s, %s, %s, %s, %s);", data)
con.commit()
print('')
"""
错误信息:OperationalError: (2059, <NULL>)
在网上找到的错误原因:MySQL8.0使用的新的认证加密方式导致了这种犯错误
具体可以查看此处:https://blog.csdn.net/rbborb/article/details/80541468
根据上述文章,我尝试更新以下相关的库,更新后相关库的版本如下:
再次运行上述代码,依然报错。
上述文章还提供另一种方法,卸载MySQL,选择之前版本
使用Python与数据库交互的更多相关文章
- Python 与数据库交互
安装:pip3 install pymysql 引入模块在python3里:from pymysql import * 使用步骤:1.创建Connection对象,用于建立与数据库的连接,创建对象调用 ...
- python与数据库交互的模块pymysql
一.Mysql 1.前提 pip install pymysql import pymysql 2.详情 Connection对象 =====>用于连接数据库 用于建立与数据库的连接 创建对象: ...
- 使用Python管理数据库
使用Python管理数据库 这篇文章的主题是如何使用Python语言管理数据库,简化日常运维中频繁的.重复度高的任务,为DBA们腾出更多时间来完成更重要的工作.文章本身只提供一种思路,写的不是很全 ...
- 14.python与数据库之mysql:pymysql、sqlalchemy
相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...
- python SQLite说一点点, python使用数据库需要注意的几点
SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. Python就 ...
- Python操作数据库之 MySQL
Python操作数据库之MySQL 一.安装Python-MySQLdb模块 Python-MySQLdb是一个操作数据库的模块,Python 通过它对 mysql 数据实现各种操作. 如果要源码安装 ...
- Python与Mysql交互
#转载请联系 在写内容之前,先放一张图,bling- 这张图算是比较详细的表达出了web开发都需要什么.用户访问网页,就是访问服务器的网页文件.这些网页文件由前端工程师编写的.服务器通常用nginx/ ...
- Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块
ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...
- python部分 + 数据库 + 网络编程
PS:附上我的博客地址,答案中略的部分我的博客都有,直接原标题搜索即可.https://www.cnblogs.com/Roc-Atlantis/ 第一部分 Python基础篇(80题) 为什么学习P ...
随机推荐
- Key-value数据库:Redis缓存服务
Redis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.其提供了多种主流语言的客户端,方便使用:同时Redis支持主 ...
- 【bzoj1941】[Sdoi2010]Hide and Seek KD-tree
题目描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏---捉迷藏. ...
- [luoguP1640] [SCOI2010]连续攻击游戏(二分图最大匹配)
传送门 我们将每一个属性和物品连边,然后枚举从小到大属性跑匈牙利,直到找不到连边 #include <cstdio> #include <cstring> #include & ...
- Caused by: java.io.FileNotFoundException: class path resource
异常: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.c ...
- Python ping 模块
使用socket模块也可以获得域名对应的ip,参考:https://blog.csdn.net/c465869935/article/details/50850598 print socket.get ...
- DispatcherServlet与ContextLoaderListener的对比
1. 从DispatcherServlet和ContextLoaderListener的初始化过程可以看出,二者分别会生成一个WebApplicationContext,且以不同的attrName注册 ...
- c#.NET的事件与委托例子
原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- CSS实现Footer固定底部,超过一屏自动撑开
方法一:给html.body都设置100%的高度,确定body下内容设置min-height有效,然后设置主体部分min-height为100%,此时若没有header.footer则刚好完美占满全屏 ...
- java面试复习
1.jvm虚拟机 https://www.cnblogs.com/dingyingsi/p/3760447.html https://blog.csdn.net/qq_41701956/article ...
- 学习javascript设计模式之发布-订阅(观察者)模式
1.发布-订阅模式又叫观察者模式,它定义对象之间一种一对多的依赖关系. 2.如何实现发布-订阅模式 2-1.首先指定好发布者 2-2.给发布者添加一个缓冲列表,用户存放回调函数以便通知订阅者 2-3. ...