Ⅰ 请教个 python mysqldb commit的问题

任何应用都离不开数据,所以在学习python的时候,当然也要学习一个如何用python操作数据库了。MySQLdb就是python对mysql数据库操作的模块。官方Introction : MySQLdb is an thread-compatible interface to the popular MySQL database server that provides the Python database API. 它其实相当于翻译了对应C的接口。

使用这种数据库接口大多是就是执行连接数据库->执行query->提取数据->关闭连接 这几个步骤。MySQLdb提供比较关键的对象,分别是Connection、Cursor、Result。具体使用步骤很简单先不写了,先写一些个人认为比较重要、值得注意的地方。

1、虽然在MySQLdb.Connect(host ,user , passw , db)函数中,我们经常使用的只是这几个参数,但是其实里面还有很多比如字符集、线程安全、ssl等也都是很重要的参数,使用时要身份注意。

2、当使用Connection.query()函数进行query后,connection 对象可以返回两种result,分别是store_result和use_result,store_result 将结果集存回client端,而use_result则是结果集保存在server端,并且维护了一个连接,会占用server资源。此时,不可以进行任何其他的查询。建议使用store_result,除非返回结果集(result set)过大或是无法使用limit的情形。

3、提取(fetch)数据的返回形式大多有三种情形。 as a tuple(how=0) ;as dictionaries, key=column or table.column if plicated(how=1);as dictionaries, key=table.column (how=2)

4、每次fetch,在result内部都会产生数据位置的移动,也就是说假如有10行数据,执行result.fetch_row(3,0),会得到前三行,再执行result.fetch_row(3,0),则会得到中间的三行,所以说fetch会导致position的移动。另外值得注意的是,如果使用use_result,也就是数据存储在server时,在fetch所有的条目之前,不能进行任何的query操作。

5、mysql本身不支持游标(Cursor),但是MySQLdb对Cursor进行了仿真。重要的执行query方法有execute 和 executemany 。execute方法,执行单条sql语句,调用executemany方法很好用,数据库性能瓶颈很大一部分就在于网络IO和磁盘IO将多个insert放在一起,只执行一次IO,可以有效的提升数据库性能。游标cursor具有fetchone、fetchmany、fetchall三个方法提取数据,每个方法都会导致游标游动,所以必须关注游标的位置。游标的scroll(value, mode)方法可以使得游标进行卷动,mode参数指定相对当前位置(relative)还是以绝对位置(absolute)进行移动。

6、MySQLdb提供了很多函数方法,在官方指南里没有完全罗列,使用者可以用help去看看,里面提供了很多方便的东西。

7、对于mysql来说,如果使用支持事务的存储引擎,那么每次操作后,commit是必须的,否则不会真正写入数据库,对应rollback可以进行相应的回滚,但是commit后是无法再rollback的。commit() 可以在执行很多sql指令后再一次调用,这样可以适当提升性能。

8、executemany处理过多的命令也不见得一定好,因为数据一起传入到server端,可能会造成server端的buffer溢出,而一次数据量过大,也有可能产生一些意想不到的麻烦。合理,分批次executemany是个不错的办法。

最后,我自己写了个pyMysql模块,主要是对MySQLdb提供的常用方法进行了简单的再次封装,也借此机会好好学习下MySQLdb,以及练习python的编码。该程序使用的数据库表,采用myisam引擎,所以没加上commit(),一般最好还是要加上的。

Ⅱ svn的commit功能,怎么用python实现

真不太清楚你什么意思,好吧照我理解的来,内给你个容ci的def
def co_file(src):
co_cmd="svn co "+src
os.system(co_cmd)
#function: ci file with log comments
def ci_file():
current_path=os.getcwd()
svn_path=current_path+"/scm"
os.chdir(svn_path)
ci_cmd="svn ci -F comments.txt --force-log"
os.system(ci_cmd)
os.system("rm -f scm/*")
os.chdir(current_path)

Ⅲ Python 数据库 insert操作不成功

importsqlite3
conn=sqlite3.connect('temple.db')
curs=conn.cursor()
curs.execute('createtableifnotexistsmovie(urlvarchar(256),timevarchar(40))')
a="http"
b="1992-11"
c="insertintomovievalues('"+a+"','"+b+"')"
d='insertintomovievalues("%s","%s")'%(a,b)
curs.execute(c)

conn.commit()
curs.close()
conn.close(

Ⅳ python怎么往mysql数据库添加数据

你最后加了commit了吗?没加commit不能插入数据额

Ⅳ 如何查看commit的内容

在push之前有时候会不放心是不是忘记加某些文件,或者是不是多删了个什么东西,这时候希望能够看看上次commit都做了些什么。
一开始想到的是用git diff,但是git diff用于当前修改尚未commit的时候较为方便,一旦commit后,需要指定上次节点的名称(一个hash值),不方便。这种时候用git log更合适,因为commit的内容会以log来记录。
下面记录几个常用的情境以及对应的命令。

仅仅想看最近谁有提交,以及提交的描述

对应命令 git log

显示Sample
commit
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code
commit
Author: XXX
Date: Thu Nov 3 04:05:34 2011 +0800
user management is mostly complete
details:
add support for account disable/enable
rewrite most related views to suit the above need
provide two decorators for access control (see README)
fixed many errors in Milestone 1
commit
Author: XXX
Date: Mon Oct 17 20:19:04 2011 -0400
fix the bug of get_ori_url_from_shorturl().
commit
Author: XXX
Date: Mon Oct 17 20:17:37 2011 -0400
fix the bug of get_article_from_short_url.

仅仅想看最后一次的提交

对应命令参数 -n 1

显示Sample
commit
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code

想看到最近一次提交所有更改过的文件

对应命令 git log -n 1 --stat

显示Sample
commit
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code
Site/accounts/decorators.py | 2 +-
Site/accounts/forms.py | 1 +
Site/accounts/models.py | 1 +
Site/accounts/readme | 3 ++-
Site/accounts/templates/account_activate.html | 1 +
Site/accounts/templates/account_disabled.html | 1 +


28 files changed, 37 insertions(+), 8 deletions(-)

想看到最近一次提交所有更改的细节

对应命令 git log -n 1 -p

显示Sample
commit
Author: XXX
Date: Thu Nov 3 11:38:15 2011 +0800
fill author information in the head of files and format some code
diff --git a/Site/accounts/decorators.py b/Site/accounts/decorators.py
index 22522bc..a6bb440 100755
--- a/Site/accounts/decorators.py
+++ b/Site/accounts/decorators.py
@@ -1,9 +1,9 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# author: Rex Nov. 3, 2011
from functools import wraps
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
-from django.utils.decorators import available_attrs
from Site.accounts.models import UserProfile
def login_required(view_func):
diff --git a/Site/accounts/forms.py b/Site/accounts/forms.py
index 016710b..778d92a 100755
--- a/Site/accounts/forms.py
+++ b/Site/accounts/forms.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+# author: Rex Nov. 3, 201


有了这几条命令,基本上对于想看最近更改的情境就可以应付过去了。最后一条并不很常用,如果有visual的工具可能更直观些。

Ⅵ 怎么用python去git commit

git是分为三部分,一部分是你自己的文件,另外一个是缓存区,最后一个是本地库。当你修改了自己的文件后,你会git add xx将修改保存到缓存区,然后再用commit推送修改到本地库中。

Ⅶ python操作oracle多少条数据commit一次比较好

LGWR进程按照顺序写在线日志,中间不会跳跃,而且LGWR进程不会在同一个日志快写2次,即使一次写入的日志快只占几个字节,下次不会再用了,这就造成日志空间的浪费。Oracle做一次Commit,就会触发LGWR进程进行日志缓冲到日志文件的写入操作,因此可以说更改相同数据量的前提下,如果提交过于频繁,产生的日志可能就会越多,即使第一次Commit占用的日志块仍可以存储下一次需要写入的日志缓冲,那么下一次Commit会再次占用一个新的日志块。
实验:
1、系统的日志块大小是512字节。
SQL> select max(lebsz) from sys.x$kccle;
MAX(LEBSZ)
----------
512
2、创建两张相同数据量的表。
SQL> select count(*) from t1;
COUNT(*)
----------
11188
SQL> select count(*) from t2;
COUNT(*)
----------
11188
3、查看删除t1表前系统的浪费日志空间量。
SQL> select name, value from v$sysstat where name like '%wastage%';NAME VALUE---------------------------------------------------------------- ----------redo wastage 2080604、逐条删除t1表的记录。
SQL> begin
2 for i in 1 .. 11188 loop
3 delete from t1 where rownum < 2;
4 commit;
5 end loop;
6 end;
7 /
5、再次查看日志空间浪费量。
SQL> select name, value from v$sysstat where name like '%wastage%';NAME VALUE---------------------------------------------------------------- ----------redo wastage 1118740SQL> select 1118740-208060 from al;
1118740-208060
--------------
910680
浪费日志空间量是910680字节。
6、查看当前进程的SID。
SQL> select distinct sid from v$mystat;
SID
----------
215
进而查出当前进程消耗的redo量总大小。
SQL> select b.name, a.value from v$sesstat a, v$statname b2 where a.statistic#=b.statistic#
3 and b.name like '%redo size%'
4 and a.sid=215;
NAME VALUE
-------------------- ----------
redo size 9103304
可知日志空间浪费比率有10%
SQL> select 910680/9103304 from al;
910680/9103304
--------------
.100038404
7、接下来选择一次性删除t2表记录,之前记录下日志空间浪费大小。
SQL> select name, value from v$sysstat where name like '%wastage%';NAME VALUE
-------------------- ----------
redo wastage 1130636
SQL> delete from t2;
11188 rows deleted.
SQL> commit;
Commit complete.
8、查看当前日志空间浪费。
SQL> select name, value from v$sysstat where name like '%wastage%';NAME VALUE
-------------------- ----------
redo wastage 1132060
9、计算日志浪费空间比率。
SQL> select 1132060-1130636 from al;
1132060-1130636
---------------
1424
SQL> select b.name, a.value from v$sesstat a, v$statname b2 where a.statistic#=b.statistic#
3 and b.name like '%redo size%'
4 and a.sid=215;
NAME VALUE
-------------------- ----------
redo size 13154544
SQL> select 1424/13154544 from al;
1424/13154544
-------------
.000108252
从结果看,日志空间浪费比率仅为0.01%。
结论:
1、LGWR进程按照顺序将日志缓冲写入日志块,不会在同一个日志块中写入两次,就可能造成上一次写入的最后一个日志块会有空间的浪费,但下一次不能再使用,只能再次写入一个新的日志块。
2、相同更改数据量的前提下,多次提交Commit要比一次Commit浪费更多的日志块空间。

Ⅷ 如何进行版本回退或只是修改已提交的commit

同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再通过rsync同步到远程的WEB服务器上。知识点:1、SVN的hooks#start-commit提交前触发事务#pre-commit提交完成前触发事务#post-commit提交完成时触发事务#pre-revprop-change版本属性修改前触发事务#post-revprop-change版本属性修改后触发事务通过上面这些名称编写的脚本就就可以实现多种功能了,相当强大。2、同步命令rsync的具体参数使用3、具有基个语言的编程能力bashpythonperl都可以实现post-commit具体实现细节post-commit脚本编辑文件:sudovim/home/svn/fitness/hooks/post-commit注意:编辑完成post-commit后,执行:sudochmod755post-commit内容:#!/bin/shexportLANG=zh_CN.UTF-8sudo/usr/bin/svnupdate/var/www/www--usernamemirze--password123456注意:svn仓库文件夹的other必须要有执行权限不然脚本无法执行。SVNupdate之前一定要先手动checkout一份出来,还有这里一定要添加用户和密码如果只是手动一样会更新,但自动一样的不行。

Ⅸ python 怎么操作数据库事务

#-*-coding:utf-8-*-
importsys
importMySQLdb
reload(sys)
sys.setdefaultencoding('utf-8')
classDB(object):
def__init__(self,host='127.0.0.1',port=3306,user='root',passwd='123',database=''):
self.__host=host
self.__port=port
self.__user=user
self.__passwd=passwd
self.__database=database
self.__open=False
print'__init__'

def__connect__(self):
ifself.__open==False:
print'connectdb...'
self.__conn=MySQLdb.connect(host=self.__host,port=self.__port,user=self.__user,passwd=self.__passwd,charset='utf8')
self.__open=Truedef__executeSql__(self,sql):
self.__connect__()
self.__executor=self.__conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
self.__executor.execute('use'+self.__database)#切换数据库
returnself.__executor.execute(sql)

defexecuteQueryForObject(self,sql):
self.__executeSql__(sql)
returnself.__executor.fetchone()
'''
返回key=value字典
'''
defexecuteQueryAll(self,sql):
self.__executeSql__(sql)
returnself.__executor.fetchall()

defexecuteUpdate(self,sql='',isAutoCommit=False):
c=self.__executeSql__(sql)
ifisAutoCommit==True:
self.commit()#提交事务
returnc
'''
#提交事务
'''
defcommit(self):
self.__conn.commit()#提交事务

'''
#关闭数据库,释放资源
'''
defcloseDB(self):
ifnotself.__connisNone:
print'closedb...'
self.__conn.commit()#提交事务
self.__conn.close()
defprint_parameters(self):
printself.__user
printself.__passwd
printself.__host
printself.__port
'''
if__name__=='__main__':
db=DB(database='tb2013')
#db.print_parameters()
#db.executeSql('select*fromtb_user')
printdb.executeQueryForObject('selectcount(*)ascountfromtb_user')
_rows=db.executeQueryAll('selectuserid,nickfromtb_userlimit10');
print_rows
forrowin_rows:
printrow
print'nick:%s'%str(row['nick'])
printdb.executeUpdate(sql='updatetb_usersetnick='test'whereuserid=95084397',isAutoCommit=True)
db.closeDB()
'''