hi jason, On Tue, Sep 9, 2008 at 9:59 PM, jason kirtland <[EMAIL PROTECTED]> wrote: > > alex bodnaru wrote: >> hi jason, >> >> On Mon, Sep 8, 2008 at 6:45 PM, jason kirtland <[EMAIL PROTECTED]> wrote: >>> alex bodnaru wrote: >>>> hello friends, >>>> >>>> i wanted to do a few sql commands in a ddl construct, but i failed with: >>>> >>>> pysqlite2:dbapi2 warning: you can execute one statement at a time >>>> >>>> i'm not very familiar with python db layer, but i know sqlite may be >>>> invoked >>>> specifically to execute one, or many statements divided by ';', so i >>>> suspect >>>> it's specifically invoked for one statement. >>>> >>>> while this is a good security measure for sql from untrusted sources, like >>>> user >>>> input, it's quite annoying for a situation where free sql should be >>>> specifically >>>> added. >>>> >>>> as for my case, i had a batch of inserts based on an external file, >>>> and i couldn't >>>> invoke ddl.execute_at in a loop, so i had to switch to inserting a >>>> batch of unioned >>>> selects in one insert, which was nice to learn :). >>> The use case behind the DDL() construct is a single statement. You can >>> fire multiple statements by using multiple DDL()s. But for inserts, >>> I've found it more useful to write a 'after-create' event listener from >>> scratch. Here's one that I use in pretty much every project, in some >>> form or another: >>> >>> def fixture(table, column_names, *rows): >>> """Insert data into table after creation.""" >>> def onload(event, schema_item, connection): >>> insert = table.insert() >>> connection.execute( >>> insert, >>> [dict(zip(column_names, column_values)) >>> for column_values in rows]) >>> table.append_ddl_listener('after-create', onload) >>> >>> Looks like this in use: >>> >>> fixture(some_table, >>> ('x', 'y'), >>> (1, 2), >>> (3, 4), >>> (5, 6)) >>> >> >> thanks for your idea. it looks cool. i understand this will be >> triggered after all DDL end. >> >> but i wanted to do arbitrary sql as DDL provides, and the insert was >> just an example for a >> series of statements. > > The DDL() function is just some sugar for the DDL event shown interface > above. If you want to perform more than one statement, the API is in > place for any customization you'd like. > >> just wondered why would this be the place to limit to one statement: >> it isn't parsed by SA >> in any way. > > SA doesn't put any limits on what SQL gets pushed through. It's passed > through directly to the DB-API execute() method. I'd guess that most > DB-API implementations will probably reject multiple statements in a > single execution. > i really have no experience with pydb. but i know for sure that sqlite can either work with one statement or with multiple ones, depending on the caller's option.
alex > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---