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

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

 import MySQLdb # windows中此包安装路径 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
#主机名
HOST = '127.0.0.1'
#用户名
USER = "root"
#密码
PASSWD = ""
#数据库名
DB = "db_name"
# 打开数据库连接
db=MySQLdb.connect(HOST,USER,PASSWD,DB)
# 获取操作游标
cursor=db.cursor() if __name__ == '__main__': if cursor:
command_a = "update tables_one set status=5 where status=0"
# 使用execute方法执行SQL语句
cursor.execute(command_a)
# 提交到数据库执行
db.commit() command2 = "select field from tables_one where id =12"
ret2 = cursor.execute(command2)
# 获取所有记录列表
ret2=cursor.fetchall()
for item in ret2:
command3 = "insert into tables_two(name) values (%s);" % (item[0])
fin=cursor.execute(command3)
db.commit()
# 关闭数据库连接
db.close()

数据库查询三种方式

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

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

 # -*- coding:utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql import text HOST = '127.0.0.1'
USER = "root"
PASSWD = ""
DB = "carrier_test"
CHARTSET = "utf8" app = Flask(__name__,instance_relative_config = True)
#链接数据库路径
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@127.0.0.1:3306/%s?charset=%s' %(USER,PASSWD,DB,CHARTSET)
#如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。
app.config['SQLALCHEMY_ECHO'] = False
# 数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。
app.config['SQLALCHEMY_POOL_SIZE'] = 6
db = SQLAlchemy(app) class Table_one(db.Model):
__tablename__ = 'table_one' id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)
com_name = db.Column('com_name', db.String(30), nullable=False)
com_about = db.Column('com_about', db.String(200), nullable=False) def __repr__(self):
return '<table_one com_name %r>' % self.com_name class Table_two(db.Model):
__tablename__ = 'table_two' id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)
reason = db.Column('reason', db.String(128), nullable=True)
create_time = db.Column('create_time', db.TIMESTAMP, server_default=text('now()'))
status = db.Column('status', db.Integer, nullable=False, default=0) def __repr__(self):
return '<table_two id %r>' % self.id def db_commit_all(lists):
try:
db.session.add_all(lists)
db.session.commit()
return 'SUCCESS'
except Exception,e:
return 'Fail!!!' def commits_to_three_judge():
com_sta_obj = Table_one.query.filter_by(com_name='只是测试使用,不用关心表间关系').all()
for ite in com_sta_obj:
ship_obj = Table_two.query.filter_by(id=ite.id).first()
if ship_obj:
if int(ship_obj.status) == 2:
ite.status = 0
print db_commit_all([ite])
print '表同步结束' if __name__=='__main__':
#执行更新数据库函数
commits_to_three_judge()

第三种:使用python的框架flask的app_context()方法编写离线脚本

import os
import sys
#防止路径出错
sys.path.insert(
0,
os.path.abspath(
os.path.dirname(
os.path.dirname(os.path.abspath(__file__))
)
)
) #本项目的DB
from ext import DB
#本项目的app
from fws import app
#本项目的model
from fws.models.share import Share def update_sql():
share_obj = Share()
share_obj.modify_time = 'dfdf'
DB.session.add(share_obj)
DB.session.commit() if __name__ == '__main__':
#直接使用app_context()方法,其中包含了配置信息等等,不用复制 model类,连接数据库等
with app.app_context():
update_sql()

三种方式对比:

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

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

3.第三种方法是最方便的方法,对于连接数据库的配置以及model等直接使用项目中的相关包,只要添加  with app.app_context() 极大的减少开发时间。

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

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

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

Flask 的 Context 机制 https://blog.tonyseek.com/post/the-context-mechanism-of-flask/

python更新数据库脚本两种方法的更多相关文章

  1. 【Python】python更新数据库脚本两种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新   1 import ...

  2. python更新数据库脚本三种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...

  3. python学习--python 连接SQLServer数据库(两种方法)

    1. python 学习.安装教程参照: http://www.runoob.com/python/python-tutorial.html 2. 集成开发环境 JetBrains PyCharm C ...

  4. 用Python计算幂的两种方法,非递归和递归法

    用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...

  5. C++连接mysql数据库的两种方法

    本文主要介绍了C++连接mysql数据库的两种方法,希望通过本文,能对你有所帮助,一起来看. 现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用a ...

  6. 转:python list排序的两种方法及实例讲解

    对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...

  7. python list排序的两种方法及实例讲解

    对List进行排序,Python提供了两个方法方法1 用List的内建函数list sort进行排序list sort(func=None, key=None, reverse=False)Pytho ...

  8. Python修改文件的两种方法

    目录: 一.以占用内存的方式修改文件 二.以占用硬盘的方式修改文件 引言 文件修改的方法从操作方式上大致可以分为两类,一种是以占用电脑内存的方式,将文件读取到内存中修改再存回硬盘:第二种方法是分别打开 ...

  9. DataGridView编辑后立即更新到数据库的两种方法

    DataGridView控件是微软预先写好的一个显示数据的控件,功能非常强大,可以显示来自数据库表的数据和XML等其他来源的数据. 方法一:基于DataAdapter对象创建一个CommandBuli ...

随机推荐

  1. js中常用的方法(数组篇)

    1.replace(),根据释义,即为代替,用法为: stringObject.replace(regexp/substr,replacement)括号内前者是待匹配字符串,并用后者代替这个字符串.例 ...

  2. Gitlab备份与恢复[七]

    标签(linux): git 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 备份 配置文件中加入 gitlab_rails['bakup_path']='/da ...

  3. 开发JQuery插件(转)

    教你开发jQuery插件(转)   阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...

  4. echarts中视觉映射器(visualMap)与时间轴(timeline)混用的实现方法

    1.简述 echarts中的 timeline 组件,提供了在多个 ECharts option 间进行切换.播放等操作的功能. 与其他组件些不同,它需要操作『多个option』. 所以除了基准的ba ...

  5. React 16.3来了:带着全新的Context API

    文章概览 React在版本16.3-alpha里引入了新的Context API,社区一片期待之声.我们先通过简单的例子,看下新的Context API长啥样,然后再简单探讨下新的API的意义. 文中 ...

  6. 不依赖jstack的java 线程dump和死锁检查工具

    java线程dump可以使用jdk的命令"jstack  pid"完成,死锁检查可以用jconsole查看到.这两个工具是java调试的常用方法. 我遇到的问题是:在sles11s ...

  7. java HotSpot 内存管理白皮书

    原文见:http://www.open-open.com/lib/view/open1381034220705.html.查阅资料后,对原文做了补充. 文中关于JVM的介绍基于JDK1.6的Hotsp ...

  8. WebService的学习

    这篇文章不错,直接转了 http://blog.csdn.net/terryzero/article/details/5976638#comments

  9. BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]

    3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...

  10. BZOJ 4767: 两双手 [DP 组合数]

    传送门 题意: 给你平面上两个向量,走到指定点,一些点不能经过,求方案数 煞笔提一开始被题面带偏了一直郁闷为什么方案不是无限 现在精简的题意.....不就是$bzoj3782$原题嘛,还不需要$Luc ...