Well that would be because the database is locked.  Is the version of SQLite 
being used by Python the same version as the command line tool is using?  What 
is the OS -- is the database stored somewhere that the OS thinks you are not 
permitted to change files (feature of windows).  Do you have another 
outstanding transaction that you have not commit or rollback?

Note rollback's are not automatic either, so after you get an error trying to 
commit, the transaction is still open and will be commit/rollback again next 
time your try to commit or rollback.

Is the database file in use by something else?  Do you have a busy wait timeout 
set?  What Operating System are you running on?


On Saturday, 4 October, 2014 08:44, Mark Halegua <phanto...@mindspring.com> 
said:

>Kieth,
>
>thanks for the info, however, I tested the following code on a LOCAL copy
>of the database,
>one where at the sqlite3 command line I was able to do an insert without
>problems, and yet,
>the python code returned the 'database is locked; error message in the
>code (I used a
>wxpython messagebox widget to display the error).
>
>Why would it return a locked message in this case?
>
>Here's the code:
>
>       def OnSave(self, event):
>               self.dbupdated = True
>               self.pub_title = self.pub_text.GetValue()
>               self.pub_remarks = self.remarks_text.GetValue()
>               print self.pub_title
>               print self.pub_remarks
>               # update relevant tables(s)
>               self.cdata.execute('insert into publishers(publisher_name,
>remarks)  values("test", "remarks");')
>
>               try:
>                       self.database.commit()
>               except sqlite.Error, dberr:
>                       wx.MessageBox(dberr.args[0], 'DB Warning',
>wx.OK)
>                       self.dbupdated = False
>
>               # clear fields
>               if self.dbupdated:
>                       self.pub_text.SetValue(' ')
>                       self.remarks_text.SetValue(' ')
>
>               print 'dbupdated = ' , self.dbupdated
>               print self.add
>               self.add = False
>               print self.add
>
>sqlite3 version 3.7.4
>
>Mark
>
>
>On Friday, October 03, 2014 10:37:06 PM Keith Medcalf wrote:
>> Yes.  pysqlite/sqlite3 in python tries to manage transactions for you
>by
>> automatically starting them, and you need to commit them yourself.
>This is
>> controlled by the isolation_level attribute set on the connection (can
>also
>> be set as a parameter when you open the connection).
>>
>> The default value is '' (an empty string).  Other valid values are
>> 'IMMEDIATE', 'EXCLUSIVE' and None.  Basically, pysqlite tries to detect
>the
>> type of statement you are running and if it is a DML statement (select,
>> insert, update, delete) it automatically begins a transaction for you
>if
>> one is not in progress by first doing a 'BEGIN '+isolation_level.  If
>the
>> statement is something other than DML, then it will 'COMMIT' before
>> executing the DDL (CREATE/DROP) then it will 'COMMIT' after executing
>it.
>> It does not know about the "WITH" statement, so treats those as DDL
>rather
>> than DML.
>>
>> Setting isolation_level to None tells pysqlite/sqlite3 to not manage
>> transactions and let the SQLite3 engine do it as it would from the C
>> interface or the sqlite3.exe command line tool (what the dbapi calls
>> autocommit mode), so you have to issue your own BEGIN and
>COMMIT/ROLLBACK
>> commands where you want them and the pysqlite/sqlite3 interface modules
>> will not attempt to begin or commit transactions for you.
>> On Friday, 3 October, 2014 21:48, you wrote:
>> >Ah, ok.  after doing a database commit I get the error going to
>stderr.
>> >Now it's just a matter
>> >of capturing/redirecting the stderr output and using an except there.
>> >
>> >On Friday, October 03, 2014 11:35:08 PM you wrote:
>> >> the sqlite3 command line doesn't require a commit, it gave an error
>> >> after the attempted insert command.
>> >>
>> >> pysqlite requires one?
>> >>
>> >> Mark
>> >>
>> >> On Friday, October 03, 2014 09:06:56 PM Keith Medcalf wrote:
>> >> > Are you committing the change?
>> >> >
>> >> > >-----Original Message-----
>> >> > >From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-
>> >> > >boun...@sqlite.org] On Behalf Of Mark Halegua
>> >> > >Sent: Friday, 3 October, 2014 20:58
>> >> > >To: sqlite-users@sqlite.org
>> >> > >Subject: [sqlite] passing error messages to pysqlite
>> >> > >
>> >> > >I have a sqlite3 database.  In the networkied are I have the db
>is
>> >
>> >locked
>> >
>> >> > >(wee've
>> >> > >discussed this before, and I'm using it mostly on a local
>machine,
>> >
>> >but I
>> >
>> >> > >need to
>> >> > >test certain conditions, networking being one).
>> >> > >
>> >> > >In the sqlite3 command line, when I try to insert new info I get
>a
>> >
>> >dabase
>> >
>> >> > >locked
>> >> > >message.
>> >> > >
>> >> > >Hosever, when I do the same in python with pysqlite, it doesn't
>> >
>> >return
>> >
>> >> > >anything
>> >> > >and the code proceeds as if nothing happened, and the program
>just
>> >
>> >goes
>> >
>> >> > >on,
>> >> > >even though the data wasn't saved/
>_______________________________________________
>sqlite-users mailing list
>sqlite-users@sqlite.org
>http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to