summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/databases/postgres.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2005-08-09 06:14:46 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2005-08-09 06:14:46 +0000
commitdac3df1a1a5b04ee2caa91b350291e0050b86d51 (patch)
tree04a2f79f6d6570ec2d9a1638f64fbdd6f02a15be /lib/sqlalchemy/databases/postgres.py
parentb9d11fad02ba63d79db78f2de688d0b0268500c2 (diff)
downloadsqlalchemy-dac3df1a1a5b04ee2caa91b350291e0050b86d51.tar.gz
Diffstat (limited to 'lib/sqlalchemy/databases/postgres.py')
-rw-r--r--lib/sqlalchemy/databases/postgres.py60
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)}