python 写入mysql

版本

python3——pymysql
python2——mysqldb

安装

安装方法
mysql -u 用户名 -p 密码 是连接数据库服务器的命令。要求你输入自己连接数据库的用户名和密码。
考虑密码如果直接明文写在这条命令行上,有些不方便(怕被别人看到),可以像你写的那样,只输入:mysql -u 用户名 -p 然后回车,此时提示你输入密码,这时候输入的密码就不再是明文的了。

数据库连接

数据库连接存在一些前提:
1、已经创建了数据库 resonant_earth
2、在数据库中已经创建了表characters
3、已知表的字段

import MySQLdb
db = MySQLdb.connect("localhost", "root", "****", "resonant_earth", charset='utf8' )
cursor = db.cursor()# 使用cursor()方法获取操作游标 
cursor.execute("SELECT * FROM characters limit 3")# 使用execute方法执行SQL语句
data = cursor.fetchone()# 使用 fetchone() 方法获取一条数据
db.close()# 关闭数据库连接
  • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
  • fetchall():接收全部的返回结果行.
  • fetchmany(size=1000)可以控制返回的数量
  • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
    fetchone()和fetchall()返回的是一个tuple,tuple的每一个元素也是tuple,并存着数据库的一行内容
    python参数格式化
    还可以使用try-except来避免错误
import MySQLdb

...
# SQL 插入语句,对于多行的语句用三引号""",不需要加分号
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()
# 关闭数据库连接
db.close()

执行事务

事务机制可以确保数据一致性。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。

# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 向数据库提交
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

读写文件和读写数据库速度对比

假定在程序效率和关键过程相当且不计入缓存等措施的条件下,读 写任何类型的数据都没有直接操作文件来的快,不论MSYQL过程如何,最后都要到磁盘上去读这个“文件”(记录存储区等效),所以当然这一切的前提是只读 内容,无关任何排序或查找操作。详情见此文

将list写入csv文件

import csv
s=[[1,3,4],[4,5,7],[2,4,6]]
out = open('try2.csv','a', newline='')#追加模式,避免出现空行
csv_write = csv.writer(out,dialect='excel')
for i in s:
    csv_write.writerow(i)
out.close()

python向mysql插入数据但是在mysql终端查不到,参见
使用python的MySQLdb库插入数据,插入成功后查询不出结果的问题,是因为innodb的autocommit问题,需要动态设置为开启,设置代码:

conn = MySQLdb.connect(host, user, pasword, db, charset='utf8')
conn.autocommit(True)

但是,执行插入插入数据后需要commit(但我没加也成功了,可能因为我的引擎是myisam)

cursor.execute(sql)
conn.commit()

插入数据的三种方法

#方法一,传入参数
sql = 'insert into monday values(%s,%s,%s)'
args = (3,4,5)
cursor.execute(sql,args)
#方法二
cursor.execute('insert into monday values(%s,%s,%s)'%(1,2,3))
#方法三
cursor.execute('insert into monday values(1,2,3)')

数据库操作的大体流程见

import MySQLdb
import csv
db = MySQLdb.connect(host='localhost',port=3306,user='root',password='***',db='resonant_earth',charset='utf8')
db.autocommit(True)
cursor = db.cursor()
sql = 'insert into clone_char values(0,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'#我的第一列是自增的,所以随便写一个数字不影响
with open('try.csv','r', newline='') as f:
    reader = csv.reader(f)
    for i in reader:
        args = tuple(list(map(float,i)))
        cursor.execute(sql,args)    
cursor.execute('select * from monday')
db.commit()#请注意:用commit()提交事务之后,才能真正的插入数据
data=cursor.fetchall()
cursor.close()
db.close()# 关闭数据库连接

多线程操作类

你可能感兴趣的:(python 写入mysql)