使用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 ...
随机推荐
- HashMap源码分析jdk1.6
HashMap数组每个元素的初始值为NULL 1.定义 public interface Map<K,V> { int size(); boolean isEmpty(); boolea ...
- BZOJ4259 残缺的字符串 【fft】
题目 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同程度的残缺. 你想 ...
- php 爬取网页列表 QueryList
主流的方式是 phpQuery 今天使用了 QueryList,是在PHPQuery的基础上进行了封装,现在最新的版本是4.0,但是要求PHP>7.0.就用了旧版的3.0 3.0文档:https ...
- js中的clientHeight和offsetHeight的区别如
如图所示:
- HDU 1969 Pie【二分】
[分析] “虽然不是求什么最大的最小值(或者反过来)什么的……但还是可以用二分的,因为之前就做过一道小数型二分题(下面等会讲) 考虑二分面积,下界L=0,上界R=∑ni=1nπ∗ri2.对于一个中值x ...
- Codeforces 551E GukiZ and GukiZiana(分块思想)
题目链接 GukiZ and GukiZiana 题目大意:一个数列,支持两个操作.一种是对区间$[l, r]$中的数全部加上$k$,另一种是查询数列中值为$x$的下标的最大值减最小值. $n < ...
- java并发之hashmap源码
在上篇博客中分析了hashmap的用法,详情查看java并发之hashmap 本篇博客重点分析下hashmap的源码(基于JDK1.8) 一.成员变量 HashMap有以下主要的成员变量 /** * ...
- [ZJOI 2016] 小星星
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 653 Solved: 400[Submit][Status] ...
- deferred 对象
转载,原文连接:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html ...
- TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小 ...