On Mon, Sep 29, 2008 at 4:46 PM, Itamar Ravid <[EMAIL PROTECTED]> wrote:
> Thanks for the answer, Mike. I was used to Oracle's behavior while writing
> raw SQL, in which the case of unquoted column identifiers doesn't matter.
> This behavior seems reasonable enough, although the inconsistency between
> the cursor description and SQLA's column identifiers could throw some people
> off.
>
> This causes the versioned plugin from Elixir.ext to fail on Oracle, so I'll
> submit a patch against it to lowercase column names in table.insert()'s.
> Thanks again.

I can't accept this patch as it breaks for people using non-lowercase
column names on non-Oracle database.
See http://elixir.ematia.de/trac/ticket/73

Some comments:
- it fails silently: Mike, is it expected that when you do:
connection.execute(table.insert(), {"inexistant_field": somevalue}),
it doesn't complain in any way?
- I really think this should be fixed at SA-level (probably in the
reflection code), as we don't do anything fancy in there...

Here is roughly what happens:

my_table = Table("my_table", metadata, autoload=True)
my_table2 = Table("my_table2", metadata, *[col.copy() for col in my_table.c])
metadata.create_all()

values = my_table.select().execute().fetchone()
connection.execute(my_table2.insert(), values)

> On Mon, Sep 29, 2008 at 5:39 PM, Michael Bayer <[EMAIL PROTECTED]>
> wrote:
>>
>>
>>
>> This is the expected behavior.  SQLA operates in a "case sensitive"
>> fashion whenever a table or column identifier is given in mixed case
>> or upper case.   Use all lower case for "case insensitive".  Since
>> SQLA seeks to provide a database-agnostic API to the backend, this
>> includes Oracle as well.    "case sensitive" means that the identifier
>> will be quoted, in which case the database expects to match the
>> identifier against an identifier of the exact same characters.
>> Oracle's usual "UPPERCASE" identifiers are in fact case insensitive.
>> So for case insensitive identifiers, make sure you use all lower case
>> names like 'book_id'.
>>
>> The keys() method of the ResultProxy, OTOH, doesn't attempt to
>> editorialize what comes back from the cursor, so in the case of oracle
>> you get upper case names (these are acceptable to use as keys for
>> row['somekey']).   While we maybe could try to connect the original
>> select() statement's SQLA-encoded column names back to the
>> cursor.description's keys and return them as defined on the SQLAlchemy
>> side, you'd still get the uppercase names when we didn't have that
>> information, like execute("select * from table").   I have a vague
>> recollection of someone having a specific issue with that behavior but
>> I'm not finding what it was at the moment.
>>
>>
>> On Sep 29, 2008, at 10:04 AM, Itamar Ravid wrote:
>>
>> >
>> > Hey guys - I've ran into a strange bug in 0.4.7p1 while trying to make
>> > use of Elixir's versioned plugin. In Oracle, given a table created as
>> > such:
>> >
>> > CREATE TABLE books
>> > (book_id NUMBER PRIMARY KEY);
>> >
>> > The following code fails:
>> >
>> > dbEng = create_engine("oracle://:@pearl")
>> > meta = MetaData()
>> > meta.bind = dbEng
>> >
>> > booksTable = Table("books", meta, autoload=True)
>> >
>> > booksTable.insert({'BOOK_ID': 200}).execute()
>> >
>> > Whilst the following, succeeds:
>> >
>> > booksTable.insert({'book_id': 200}).execute()
>> >
>> > This is strange, considering the fact that the following:
>> >
>> > result = booksTable.select().execute().fetchone()
>> > print result.keys()
>> >
>> > ... results in the column names in uppercase.
>> >
>> > Am I doing anything wrong?
>> >



-- 
Gaƫtan de Menten
http://openhex.org

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to