python更新数据库脚本两种方法

最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新。

第一种:使用python的MySQLdb模块利用原生的sql语句进行更新

 1 import MySQLdb
 2 #主机名
 3 HOST = '127.0.0.1'
 4 #用户名
 5 USER = "root"
 6 #密码
 7 PASSWD = "123456"
 8 #数据库名
 9 DB = "db_name"
10 # 打开数据库连接
11 db=MySQLdb.connect(HOST,USER,PASSWD,DB)
12 # 获取操作游标
13 cursor=db.cursor()
14 
15 if __name__ == '__main__':
16 
17     if cursor:
18         command_a = "update tables_one set status=5 where status=0"
19         # 使用execute方法执行SQL语句
20         cursor.execute(command_a)
21         # 提交到数据库执行
22         db.commit()
23 
24         command2 = "select field from tables_one where id =12"
25         ret2 = cursor.execute(command2)
26         # 获取所有记录列表
27         ret2=cursor.fetchall()
28         for item in ret2:
29                 command3 = "insert into tables_two(name) values (%s);" % (item[0])
30                 fin=cursor.execute(command3)
31                 db.commit()
32         # 关闭数据库连接
33         db.close()

数据库查询三种方式

  • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
  • fetchall():接收全部的返回结果行.
  • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

第二种:使用python的框架flask和sqlalchemy进行更新

 1 # -*- coding:utf-8 -*-
 2 from flask import Flask
 3 from flask_sqlalchemy import SQLAlchemy
 4 from sqlalchemy.sql import text
 5 
 6 HOST = '127.0.0.1'
 7 USER = "root"
 8 PASSWD = "123456"
 9 DB = "carrier_test"
10 CHARTSET = "utf8"
11 
12 app = Flask(__name__,instance_relative_config = True)
13 #链接数据库路径
14 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@127.0.0.1:3306/%s?charset=%s' %(USER,PASSWD,DB,CHARTSET)
15 #如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
16 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
17 #如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。
18 app.config['SQLALCHEMY_ECHO'] = False
19 # 数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。
20 app.config['SQLALCHEMY_POOL_SIZE'] = 6
21 db = SQLAlchemy(app)
22 
23 class Table_one(db.Model):
24     __tablename__ = 'table_one'
25 
26     id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)
27     com_name = db.Column('com_name', db.String(30), nullable=False)
28     com_about = db.Column('com_about', db.String(200), nullable=False)
29 
30     def __repr__(self):
31         return '<table_one com_name %r>' % self.com_name
32 
33 
34 class Table_two(db.Model):
35     __tablename__ = 'table_two'
36 
37     id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)
38     reason = db.Column('reason', db.String(128), nullable=True)
39     create_time = db.Column('create_time', db.TIMESTAMP, server_default=text('now()'))
40     status = db.Column('status', db.Integer, nullable=False, default=0)
41 
42     def __repr__(self):
43         return '<table_two id %r>' % self.id
44 
45 def db_commit_all(lists):
46     try:
47         db.session.add_all(lists)
48         db.session.commit()
49         return 'SUCCESS'
50     except Exception,e:
51         return 'Fail!!!'
52 
53 def commits_to_three_judge():
54     com_sta_obj = Table_one.query.filter_by(com_name='只是测试使用,不用关心表间关系').all()
55     for ite in com_sta_obj:
56         ship_obj = Table_two.query.filter_by(id=ite.id).first()
57         if ship_obj:
58             if int(ship_obj.status) == 2:
59                 ite.status = 0
60                 print db_commit_all([ite])
61     print '表同步结束'
62 
63 64 
65 if __name__=='__main__':
66     #执行更新数据库函数
67     commits_to_three_judge()

两种方式对比:

1.在实际项目中,数据库的更新 需要用到很多相关函数进行数据的收集,判断是否满足条件等,而这些相关函数在项目中都是用 Sqlalchemy进行数据相关操作,比如第二种方法里的db_commit_all()函数

2.使用第二种方法,直接复制这些函数到脚本中即可,如果使用第一种方法,则需要重写相关函数,增加开发时间,浪费精力。

3.如果项目中是使用flask进行开发,推荐使用第二种方法进行数据库更新。

Flask-SQLAlchemy中配置相关链接 http://www.pythondoc.com/flask-sqlalchemy/config.html

python使用MySQLdb操作mysql数据库相关连接 http://www.runoob.com/python/python-mysql.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的博客

防止sql注入以及注入原理

1. 判断是否可以注入 id=145 and 1=1正常显示 id=145 and 1=2 我这里可以注入的是正常显示,网上说提示错误 id=145′后面...

34050
来自专栏用户2442861的专栏

mongodb操作(概述以及相关的命令)

http://blog.csdn.net/ljfbest/article/details/11979609

10120
来自专栏佳爷的后花媛

php基础(二)

输出b,if中的空值赋值给$num,因此if条件必定为false,还有其他一些大同小异的题目,用=和==判断for循环的,只要把握好基本的概念就行了

35820
来自专栏禁心尽力

solr_架构案例【京东站内搜索】(附程序源代码)

注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的。 ...

29470
来自专栏JetpropelledSnake

Django学习笔记之Queryset的高效使用

对象关系映射 (ORM) 使得与SQL数据库交互更为简单,不过也被认为效率不高,比原始的SQL要慢。

18030
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch增删改查 之 —— mget多文档查询

之前说过了针对单一文档的增删改查,基本也算是达到了一个基本数据库的功能。本篇主要描述的是多文档的查询,通过这个查询语法,可以根据多个文档的查询条件,返回多个文...

240100
来自专栏别先生

基于jsp+servlet图书管理系统之后台用户信息修改操作

上一篇的博客写的是查询操作,且附有源码和数据库,这篇博客写的是修改操作,附有从头至尾写的代码(详细的注释)和数据库!  此次修改操作的源码和数据库:http:...

593100
来自专栏Android知识点总结

安卓中对于文件夹的综合操作

12920
来自专栏Golang语言社区

GO语言常用的文件读取方式

本文实例讲述了GO语言常用的文件读取方式。分享给大家供大家参考。具体分析如下: Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。...

47270
来自专栏Java成神之路

Spring_总结_04_高级配置(四)_bean的作用域

Spring应用上下文中所有的bean默认都是单例的。也就是说,不管一个bean被注入到其他bean多少次,每次注入的都是同一个实例。

10620

扫码关注云+社区

领取腾讯云代金券