]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
(no commit message)
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 9 Aug 2005 06:14:46 +0000 (06:14 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 9 Aug 2005 06:14:46 +0000 (06:14 +0000)
lib/sqlalchemy/databases/postgres.py
test/select.py

index 7d0aaea5ade61619f9fed78a45c954da90dc5c25..fa5124ed11d4932b6e589ff8c2b71a4f41dcb5fa 100644 (file)
@@ -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)}
index b43636333f8637b5da9b0e0749755d35c603c080..1c2e4562cd293f63c5344c828a590676e0f099c0 100644 (file)
@@ -195,7 +195,7 @@ FROM mytable, myothertable WHERE foo.id = foofoo(lala) AND datetime(foo) = Today
             "SELECT myothertable.otherid, myothertable.othername, mytable.myid, mytable.name, mytable.description \
 FROM myothertable, mytable WHERE mytable.myid = myothertable.otherid"
         )
-        
+
         self.runtest(
             select(
                 [table],
@@ -268,12 +268,12 @@ EXISTS (select yay from foo where boo = lar)",
             engine = postgres.engine())
 
 
-        self.runtest(query, 
-            "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername \
-FROM mytable, myothertable WHERE mytable.myid = myothertable.otherid(+) AND \
-mytable.name = :mytable_name AND mytable.myid = :mytable_myid AND \
-myothertable.othername != :myothertable_othername AND EXISTS (select yay from foo where boo = lar)",
-            engine = oracle.engine(use_ansi = False))
+#        self.runtest(query, 
+#            "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername \
+#FROM mytable, myothertable WHERE mytable.myid = myothertable.otherid(+) AND \
+#mytable.name = :mytable_name AND mytable.myid = :mytable_myid AND \
+#myothertable.othername != :myothertable_othername AND EXISTS (select yay from foo where boo = lar)",
+#            engine = oracle.engine(use_ansi = False))
 
     def testbindparam(self):
         self.runtest(select(