diff options
Diffstat (limited to 'lib/sqlalchemy/databases/firebird.py')
-rw-r--r-- | lib/sqlalchemy/databases/firebird.py | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/lib/sqlalchemy/databases/firebird.py b/lib/sqlalchemy/databases/firebird.py index a02781c84..07f07644f 100644 --- a/lib/sqlalchemy/databases/firebird.py +++ b/lib/sqlalchemy/databases/firebird.py @@ -5,15 +5,11 @@ # the MIT License: http://www.opensource.org/licenses/mit-license.php -import sys, StringIO, string, types +import warnings -from sqlalchemy import util +from sqlalchemy import util, sql, schema, ansisql, exceptions import sqlalchemy.engine.default as default -import sqlalchemy.sql as sql -import sqlalchemy.schema as schema -import sqlalchemy.ansisql as ansisql import sqlalchemy.types as sqltypes -import sqlalchemy.exceptions as exceptions _initialized_kb = False @@ -176,7 +172,7 @@ class FBDialect(ansisql.ANSIDialect): else: return False - def reflecttable(self, connection, table): + def reflecttable(self, connection, table, include_columns): #TODO: map these better column_func = { 14 : lambda r: sqltypes.String(r['FLEN']), # TEXT @@ -254,11 +250,20 @@ class FBDialect(ansisql.ANSIDialect): while row: name = row['FNAME'] - args = [lower_if_possible(name)] + python_name = lower_if_possible(name) + if include_columns and python_name not in include_columns: + continue + args = [python_name] kw = {} # get the data types and lengths - args.append(column_func[row['FTYPE']](row)) + coltype = column_func.get(row['FTYPE'], None) + if coltype is None: + warnings.warn(RuntimeWarning("Did not recognize type '%s' of column '%s'" % (str(row['FTYPE']), name))) + coltype = sqltypes.NULLTYPE + else: + coltype = coltype(row) + args.append(coltype) # is it a primary key? kw['primary_key'] = name in pkfields @@ -301,39 +306,39 @@ class FBDialect(ansisql.ANSIDialect): class FBCompiler(ansisql.ANSICompiler): """Firebird specific idiosincrasies""" - def visit_alias(self, alias): + def visit_alias(self, alias, asfrom=False, **kwargs): # Override to not use the AS keyword which FB 1.5 does not like - self.froms[alias] = self.get_from_text(alias.original) + " " + self.preparer.format_alias(alias) - self.strings[alias] = self.get_str(alias.original) + if asfrom: + return self.process(alias.original, asfrom=True) + " " + self.preparer.format_alias(alias) + else: + return self.process(alias.original, asfrom=True) def visit_function(self, func): if len(func.clauses): - super(FBCompiler, self).visit_function(func) + return super(FBCompiler, self).visit_function(func) else: - self.strings[func] = func.name + return func.name - def visit_insert_column(self, column, parameters): - # all column primary key inserts must be explicitly present - if column.primary_key: - parameters[column.key] = None + def uses_sequences_for_inserts(self): + return True - def visit_select_precolumns(self, select): + def get_select_precolumns(self, select): """Called when building a ``SELECT`` statement, position is just before column list Firebird puts the limit and offset right after the ``SELECT``... """ result = "" - if select.limit: - result += " FIRST %d " % select.limit - if select.offset: - result +=" SKIP %d " % select.offset - if select.distinct: + if select._limit: + result += " FIRST %d " % select._limit + if select._offset: + result +=" SKIP %d " % select._offset + if select._distinct: result += " DISTINCT " return result def limit_clause(self, select): - """Already taken care of in the `visit_select_precolumns` method.""" + """Already taken care of in the `get_select_precolumns` method.""" return "" @@ -364,7 +369,7 @@ class FBSchemaDropper(ansisql.ANSISchemaDropper): class FBDefaultRunner(ansisql.ANSIDefaultRunner): def exec_default_sql(self, default): - c = sql.select([default.arg], from_obj=["rdb$database"]).compile(engine=self.connection) + c = sql.select([default.arg], from_obj=["rdb$database"]).compile(bind=self.connection) return self.connection.execute_compiled(c).scalar() def visit_sequence(self, seq): |