Maciej Filip, did you ever found a solution in SQLAlchemy for this? I'm 
experiencing the same "Restoring.." problem.. 

On Tuesday, July 12, 2011 at 1:04:00 PM UTC-4, Michael Bayer wrote:
>
>
> On Jul 12, 2011, at 12:44 PM, Maciej Filip Szkodziński wrote:
>
> Oops, I was trying it with
> engine.connect().execution_options(autocommit=True).execute as well,
> and didn't notice there was a difference in the echo when editing the
> pastebin. There's of course no COMMIT at the end with eng.execute().
>
> I've updated pastebin with both versions.
>
> The behaviour doesn't change though. In both cases, if the file
> doesn't exist, it doesn't exist after finishing the BACKUP. If an
> empty file already exists, _even without the COMMIT_, the server still
> writes 2KB to it.
>
> As for the autocommit error, the server complains about doing a backup
> within a transaction. I'm guessing sqlalchemy's engine.execute()
> doesn't automatically start a transaction, while pyodbc's
> conn.execute() without autocommit does start a transaction.
>
>
> DBAPI doesn't have a BEGIN, a connection is always in a transaction, 
> unless a non-standard "autocommit" flag like that of PyODBCs is used.
>
> PyODBC should be starting a transaction the moment the first statement is 
> emitted.   There should not be a behavioral difference between 
> conn.execute() (which is a non-standard convenience method specific to 
> PyODBC) and cursor.execute() (the DBAPI method), though this is definitely 
> possible.
>
> In any case this is well in the range of PyODBC quirks and you should 
> check out the pyodbc site/mailing list/tracker for more details on this.
>
>
> If you try to run a BACKUP via pyodbc, the cursor.execute() call starts 
> and finishes with no error, but the backup doesn’t get made.  With help 
> from CubicWeb‘s post MS SQL Server Backuping gotcha, I learned that BACKUP 
> and RESTOREs over ODBC trigger some kind of asynchronous / multiple result 
> set mode.
>
>
>
> I'm guessing sqlalchemy closes the cursor before the server can finish
> the backup?
>
>
> the two terms "asynchronous" "multiple result set" don't really go 
> together here.  "multiple result sets" refers to a cursor that has multiple 
> results via cursor.nextset().   SQLA currently doesn't support this mode of 
> usage.  If SQLA's closing of the cursor is the issue here then just use the 
> PyODBC connection directly.    engine.raw_connection() or 
> engine.connect().connection will give you one from the pool.   If you flip 
> any "autocommit" flags you'd want to set them back when complete, or 
> alternatively remove the connection from the pool using connection.detach() 
> (SQLAlchemy method added to the DBAPI connection).
>
> the "asynchronous background process" concept sounds a little more sketchy 
> here, if that were the case I would think the BACKUP command has some way 
> to check on the "status" of the operation before commit() occurs, but 
> that's really not how SQL commands usually work - standard behavior is to 
> block until complete.
>
>
>
>
>
> On Jul 12, 4:25 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> On Jul 12, 2011, at 8:27 AM, Maciej Filip Szkodziński wrote:
>
>
> The database is part of a desktop accounting application running on
>
> Windows. I'm writing a program to interface with it, to automate
>
> adding documents.
>
>
> The idea was that it would be run once a month to add a bunch of
>
> invoices. The backup would run before this operation, in case
>
> something unexpected goes wrong.
>
>
> Reducing the scope of the program, and dealing with backups separately
>
> does sound like a better idea.
>
>
> engine.execute() is equivalent to:
>
>
> conn = dbapi.connect(...)
>
> cursor = conn.cursor()
>
> cursor.execute(<statement>)
>
> < possibly call conn.commit() here if the statement qualifies for 
> autocommit>
>
> return cursor via ResultProxy()
>
> cursor.close()/conn.close() when ResultProxy is closed, automatic if no 
> cursor.description was present.
>
>
> your examples with pyodbc indicate pyodbc is a little conflicted how to 
> handle this.  The nonstandard conn.execute() call seems to fail if Pyodbc's 
> "autocommit" (note this is entirely distinct from the SQLAlchemy engine 
> autocommit feature) is not enabled, yet your SQLAlchemy script didn't throw 
> this error when using cursor.execute() (where again the pyodbc autocommit 
> flag remains at false unless you modified it yourself).
>
>
> If the "commit" call is required then you'd need to be using 
> engine.connect().execution_options(autocommit=True).execute(my statement). 
>   The BACKUP command doesn't trigger autocommit, so I'm not sure how your 
> SQL log ended up generating a COMMIT statement.
>
>
>
>
> On Jul 12, 7:44 am, Eric Ongerth <ericonge...@gmail.com> wrote:
>
> I think more common practice is just to use shell scripts (whether in
>
> scheduled tasks / cron jobs or manually) for backup.  But I don't know
>
> MSSQL specifically.  I just have rarely heard of anyone trying to
>
> accomplish their backup with SQLAlchemy as part of the chain of
>
> command.
>
>
> On Jul 11, 2:06 pm, Maciej Filip Szkodziñski
>
>
> <maciej.szkodzin...@gmail.com> wrote:
>
> Hello,
>
>
> I'm trying to backup a database running on SQL Server 2008 Express.
>
> I'm using pyodbc as the driver.
>
>
> This backup code executes happily, however no file is written to the
>
> provided path. I've also tried placing an empty file in the path, and
>
> only 2KB of data gets written to it.
>
>
> eng = create_engine("mssql+pyodbc://%s:%s@%s" % (uid, pwd, server))
>
> eng.execute('BACKUP DATABASE test TO DISK=?',
>
>                      backupFilePath)
>
> # <sqlalchemy.engine.base.ResultProxy object at 0x015868F0>
>
>
> os.path.isfile(backupFilePath)
>
> # False
>
>
> I am able to backup the database with the same parameters in 'bare'
>
> pyodbc.
>
>
> Here's a more verbose version of both, sqlalchemy and pyodbc, backup
>
> code:http://pastebin.com/6x1RRTqz
>
>
> I've also tried restoring an existing backup with sqlalchemy. Again, I
>
> get the ResultProxy, but the newly 'restored' database is stuck in
>
> perpetual 'Restoring...' state, and trying to use it results in:
>
> # Database 'test' cannot be opened. It is in the middle of a restore.
>
>
> I had a similar problem with bare pyodbc, and googling suggested that
>
> this loop is required for the backup/restore operation to continue and
>
> finish:
>
>
> while backupCursor.nextset():
>
>     pass
>
>
> where backupCursor is the one returned by execute('BACKUP...').
>
>
> Is there a different way of doing backups via sqlalchemy, or some way
>
> around this, or should I stick with bare pyodbc for backups?
>
>
> --
>
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
>
> To post to this group, send email to sqlal...@googlegroups.com 
> <javascript:>.
>
> To unsubscribe from this group, send email to 
> sqlalchemy+...@googlegroups.com <javascript:>.
>
> For more options, visit this group 
> athttp://groups.google.com/group/sqlalchemy?hl=en.
>
>
>
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlal...@googlegroups.com 
> <javascript:>.
> To unsubscribe from this group, send email to 
> sqlalchemy+...@googlegroups.com <javascript:>.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
>
>
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to