Anoop
2011-04-06 19:54:20 UTC
Hi All
I am using Sqlalchemy 0.6.6 + cx_oracle5.0.3+python 2.6.4 and
oracle 10g from linux.
when I tried the sqlalchemy autoload feature
tbl=Table('autoload_test', meta,
autoload=True,autoload_with=engine, schema=None)
Here I am getting tbl.columns.keys() are all lower case even if
my column names are in upper case in DB . I checked the issue and
found the reason
in get_columns method (sqlalchemy/dialects/oracle/base.py)
after fetching the column names in the loop before assigning the
column name to colname variable normalize_name(sqlalchemy/dialects/
oracle/base.py) method is calling and finally the colname varaiable
will set as a value of name key and finally the dict will append to a
list in the loop.
cdict = {
'name': colname,
'type': coltype,
'nullable': nullable,
'default': default,
}
columns.append(cdict)
Here In normalize_name method
the code is
+++++++++++++++++++++++++++++++++++++++++++++++++
if name.upper() == name and \
not
self.identifier_preparer._requires_quotes(name.lower()):
return name.lower()
else:
return name
++++++++++++++++++++++++++++++++++++++++++++++++++
the _requires_quotes(sqlalchemy/sql/compiler.py) method will return a
Boolean value
++++++++++++++++++++++++++++++++++++++++++++++++++
def _requires_quotes(self, value):
"""Return True if the given identifier requires quoting."""
lc_value = value.lower()
return (lc_value in self.reserved_words
or value[0] in self.illegal_initial_characters
or not self.legal_characters.match(unicode(value))
or (lc_value != value))
++++++++++++++++++++++++++++++++++++++++++++++++++
Here the problem is lc_value!=value checking ,suppose my column name
is 'FIRST_NAME' in normalize_name method we called this method
"self.identifier_preparer._requires_quotes(name.lower())" ,so value
='first_name'
and lc_value = value.lower() => 'fist_name'
* In this case the last checking 'first_name'!='first_name' will
always fail and all four condition in my case is false now so
_requires_quotes will return False
e
* so now in normalize_name method return name.lower() will invoke
and i will get column name in upper case.
t
when I modified the code in normalize_name method like below
if name.upper() == name and \
not self.identifier_preparer._requires_quotes(name):
return name.lower()
else:
return name
I am getting table column names in upper case (ie how they are in
DB, here I am not using any quoted column names') . . Now SQLServer
+SqlAlchemy +autoload give upper case column names in upper case but
when connecting with oracle upper case column names will be converted
to lower case.Anybody have an idea why requires_quotes method is
called like this?
thanks:
Anoop
I am using Sqlalchemy 0.6.6 + cx_oracle5.0.3+python 2.6.4 and
oracle 10g from linux.
when I tried the sqlalchemy autoload feature
tbl=Table('autoload_test', meta,
autoload=True,autoload_with=engine, schema=None)
Here I am getting tbl.columns.keys() are all lower case even if
my column names are in upper case in DB . I checked the issue and
found the reason
in get_columns method (sqlalchemy/dialects/oracle/base.py)
after fetching the column names in the loop before assigning the
column name to colname variable normalize_name(sqlalchemy/dialects/
oracle/base.py) method is calling and finally the colname varaiable
will set as a value of name key and finally the dict will append to a
list in the loop.
cdict = {
'name': colname,
'type': coltype,
'nullable': nullable,
'default': default,
}
columns.append(cdict)
Here In normalize_name method
the code is
+++++++++++++++++++++++++++++++++++++++++++++++++
if name.upper() == name and \
not
self.identifier_preparer._requires_quotes(name.lower()):
return name.lower()
else:
return name
++++++++++++++++++++++++++++++++++++++++++++++++++
the _requires_quotes(sqlalchemy/sql/compiler.py) method will return a
Boolean value
++++++++++++++++++++++++++++++++++++++++++++++++++
def _requires_quotes(self, value):
"""Return True if the given identifier requires quoting."""
lc_value = value.lower()
return (lc_value in self.reserved_words
or value[0] in self.illegal_initial_characters
or not self.legal_characters.match(unicode(value))
or (lc_value != value))
++++++++++++++++++++++++++++++++++++++++++++++++++
Here the problem is lc_value!=value checking ,suppose my column name
is 'FIRST_NAME' in normalize_name method we called this method
"self.identifier_preparer._requires_quotes(name.lower())" ,so value
='first_name'
and lc_value = value.lower() => 'fist_name'
* In this case the last checking 'first_name'!='first_name' will
always fail and all four condition in my case is false now so
_requires_quotes will return False
e
* so now in normalize_name method return name.lower() will invoke
and i will get column name in upper case.
t
when I modified the code in normalize_name method like below
if name.upper() == name and \
not self.identifier_preparer._requires_quotes(name):
return name.lower()
else:
return name
I am getting table column names in upper case (ie how they are in
DB, here I am not using any quoted column names') . . Now SQLServer
+SqlAlchemy +autoload give upper case column names in upper case but
when connecting with oracle upper case column names will be converted
to lower case.Anybody have an idea why requires_quotes method is
called like this?
thanks:
Anoop
--
You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To post to this group, send email to ***@googlegroups.com.
To unsubscribe from this group, send email to sqlalchemy+***@googlegroups.com.
For more options, visit this group at http://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 ***@googlegroups.com.
To unsubscribe from this group, send email to sqlalchemy+***@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.