# -*- 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与数据库交互的更多相关文章

  1. Python 与数据库交互

    安装:pip3 install pymysql 引入模块在python3里:from pymysql import * 使用步骤:1.创建Connection对象,用于建立与数据库的连接,创建对象调用 ...

  2. python与数据库交互的模块pymysql

    一.Mysql 1.前提 pip install pymysql import pymysql 2.详情 Connection对象 =====>用于连接数据库 用于建立与数据库的连接 创建对象: ...

  3. 使用Python管理数据库

    使用Python管理数据库   这篇文章的主题是如何使用Python语言管理数据库,简化日常运维中频繁的.重复度高的任务,为DBA们腾出更多时间来完成更重要的工作.文章本身只提供一种思路,写的不是很全 ...

  4. 14.python与数据库之mysql:pymysql、sqlalchemy

    相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...

  5. python SQLite说一点点, python使用数据库需要注意的几点

    SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. Python就 ...

  6. Python操作数据库之 MySQL

    Python操作数据库之MySQL 一.安装Python-MySQLdb模块 Python-MySQLdb是一个操作数据库的模块,Python 通过它对 mysql 数据实现各种操作. 如果要源码安装 ...

  7. Python与Mysql交互

    #转载请联系 在写内容之前,先放一张图,bling- 这张图算是比较详细的表达出了web开发都需要什么.用户访问网页,就是访问服务器的网页文件.这些网页文件由前端工程师编写的.服务器通常用nginx/ ...

  8. Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块

    ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...

  9. python部分 + 数据库 + 网络编程

    PS:附上我的博客地址,答案中略的部分我的博客都有,直接原标题搜索即可.https://www.cnblogs.com/Roc-Atlantis/ 第一部分 Python基础篇(80题) 为什么学习P ...

随机推荐

  1. iOS学习笔记31-从图册获取图片和视频

    一.从图册中获取本地图片和视频 从图册中获取文件,我们使用的是UIImagePickerController,这个类我们在之前的摄像头中使用过,这里是链接:iOS学习笔记27-摄像头,这里我们使用的是 ...

  2. 【bzoj1954】Pku3764 The xor-longest Path Trie树

    题目描述  给定一棵n个点的带权树,求树上最长的异或和路径 输入 The input contains several test cases. The first line of each test ...

  3. 用meta标签让网页用360打开时默认为极速模式

    最近做项目,用360浏览器访问自己的本地网页,发现都是默认在兼容模式下打开,做的淡入淡出轮播效果在兼容模式下看时,感觉切换很生硬.百度,发现360官网帮助里有说明用meta标签控制浏览器内核,网址为h ...

  4. [luoguP1110] [ZJOI2007]报表统计(set暴力)

    传送门 两个multiset 一个记录相邻元素的差,一个放所有的元素 2个数组 val[i]记录第i个的值,last[i]记录第i个最后插入的数的值 然后乱搞 #include <set> ...

  5. 洛谷P1418 选点问题

    P1418 选点问题 74通过 240提交 题目提供者tinylic 标签云端 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 非常重要!! 90分的点这里 题 ...

  6. P2730 魔板 Magic Squares (搜索)

    题目链接 Solution 这道题,我是用 \(map\) 做的. 具体实现,我们用一个 \(string\) 类型表示任意一种情况. 可以知道,排列最多只有 \(8!\) 个. 然后就是直接的广搜了 ...

  7. java面试题之什么是多线程上下文切换

    多线程会共同使用一组计算机上的CPU,而线程数大于给程序分配的CPU数量时,为了让各个线程都有执行的机会,就需要轮流使用CPU.不同的线程切换使用CPU发生的数据切换等就是上下文切换

  8. [转] Makefile 基础 (6) —— Makefile 使用条件判断

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  9. 【前端学习笔记】2015-09-01 附 split()方法、readyState

    1.split():作用对象是一个字符串或者字符串对象,会要求设置两个参数(分割点(separator),分割出来的数量(number)),ps:1."2:3:4:5".split ...

  10. bzoj 3881 [Coci2015]Divljak fail树+树链的并

    题目大意 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: "1 P",Bob往自己的集合里添 ...