diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2005-08-09 06:14:46 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2005-08-09 06:14:46 +0000 |
commit | dac3df1a1a5b04ee2caa91b350291e0050b86d51 (patch) | |
tree | 04a2f79f6d6570ec2d9a1638f64fbdd6f02a15be /lib/sqlalchemy/databases/postgres.py | |
parent | b9d11fad02ba63d79db78f2de688d0b0268500c2 (diff) | |
download | sqlalchemy-dac3df1a1a5b04ee2caa91b350291e0050b86d51.tar.gz |
Diffstat (limited to 'lib/sqlalchemy/databases/postgres.py')
-rw-r--r-- | lib/sqlalchemy/databases/postgres.py | 60 |
1 files changed, 57 insertions, 3 deletions
diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index 7d0aaea5a..fa5124ed1 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -22,13 +22,67 @@ import sqlalchemy.schema as schema import sqlalchemy.ansisql as ansisql from sqlalchemy.ansisql import * +colspecs = { + schema.INT : "INTEGER", + schema.CHAR : "CHAR(%(length)s)", + schema.VARCHAR : "VARCHAR(%(length)s)", + schema.TEXT : "TEXT", + schema.FLOAT : "NUMERIC(%(precision)s, %(length)s)", + schema.DECIMAL : "NUMERIC(%(precision)s, %(length)s)", + schema.TIMESTAMP : "TIMESTAMP", + schema.DATETIME : "TIMESTAMP", + schema.CLOB : "TEXT", + schema.BLOB : "BLOB", + schema.BOOLEAN : "BOOLEAN", +} + + def engine(**params): return PGSQLEngine(**params) - + class PGSQLEngine(ansisql.ANSISQLEngine): def __init__(self, **params): ansisql.ANSISQLEngine.__init__(self, **params) - def create_connection(self): + def connect_args(self): + return [[], {}] + + def compile(self, statement, bindparams): + compiler = PGCompiler(self, statement, bindparams) + statement.accept_visitor(compiler) + return compiler + + def pre_exec(self, connection, cursor, statement, parameters, echo = None, compiled = None, **kwargs): + if compiled is None: return + if getattr(compiled, "isinsert", False): + for primary_key in compiled.statement.table.primary_keys: + # pseudocode + if echo is True or self._echo: + self.log(primary_key.sequence.text) + res = cursor.execute(primary_key.sequence.text) + parameters[primary_key.key] = res.fetchrow()[0] + + def dbapi(self): + return None +# return psycopg + + def columnimpl(self, column): + return PGColumnImpl(column) + + def reflecttable(self, table): raise NotImplementedError() - + +class PGCompiler(ansisql.ANSICompiler): + def visit_insert(self, insert): + self.isinsert = True + super(self).visit_insert(insert) + +class PGColumnImpl(sql.ColumnSelectable): + def get_specification(self): + coltype = self.column.type + if isinstance(coltype, types.ClassType): + key = coltype + else: + key = coltype.__class__ + + return self.name + " " + colspecs[key] % {'precision': getattr(coltype, 'precision', None), 'length' : getattr(coltype, 'length', None)} |