]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Added float type to support real/double precision/float8/etc sql data types. Added...
authorRobert Leftwich <rtl@pobox.com>
Thu, 1 Dec 2005 12:51:38 +0000 (12:51 +0000)
committerRobert Leftwich <rtl@pobox.com>
Thu, 1 Dec 2005 12:51:38 +0000 (12:51 +0000)
lib/sqlalchemy/databases/mysql.py
lib/sqlalchemy/databases/postgres.py
lib/sqlalchemy/databases/sqlite.py
lib/sqlalchemy/types.py
test/alltests.py
test/columns.py [new file with mode: 0644]
test/engines.py

index 45d85187a67dbf1ee4ccc749bb2adb038cd5756e..429ffc0fd0437aded202d9bd0aed5c07d727c72e 100644 (file)
@@ -33,6 +33,9 @@ except:
 class MSNumeric(sqltypes.Numeric):
     def get_col_spec(self):
         return "NUMERIC(%(precision)s, %(length)s)" % {'precision': self.precision, 'length' : self.length}
+class MSFloat(sqltypes.Float):
+    def get_col_spec(self):
+        return "FLOAT(%(precision)s)" % {'precision': self.precision}
 class MSInteger(sqltypes.Integer):
     def get_col_spec(self):
         return "INTEGER"
@@ -58,6 +61,7 @@ class MSBoolean(sqltypes.Boolean):
 colspecs = {
     sqltypes.Integer : MSInteger,
     sqltypes.Numeric : MSNumeric,
+    sqltypes.Float : MSFloat,
     sqltypes.DateTime : MSDateTime,
     sqltypes.String : MSString,
     sqltypes.Binary : MSBinary,
@@ -72,6 +76,7 @@ ischema_names = {
     'char' : MSChar,
     'text' : MSText,
     'decimal' : MSNumeric,
+    'float' : MSFloat,
     'timestamp' : MSDateTime,
     'binary' : MSBinary,
 }
index c8e742fe49bd97851023413f2b746779c04a1403..75b9e1aee3d36c53244f2d6cb290187909b6bfab 100644 (file)
@@ -36,6 +36,9 @@ except:
 class PGNumeric(sqltypes.Numeric):
     def get_col_spec(self):
         return "NUMERIC(%(precision)s, %(length)s)" % {'precision': self.precision, 'length' : self.length}
+class PGFloat(sqltypes.Float):
+    def get_col_spec(self):
+        return "FLOAT(%(precision)s)" % {'precision': self.precision}
 class PGInteger(sqltypes.Integer):
     def get_col_spec(self):
         return "INTEGER"
@@ -70,6 +73,7 @@ class PGBoolean(sqltypes.Boolean):
 pg2_colspecs = {
     sqltypes.Integer : PGInteger,
     sqltypes.Numeric : PGNumeric,
+    sqltypes.Float : PGFloat,
     sqltypes.DateTime : PG2DateTime,
     sqltypes.String : PGString,
     sqltypes.Binary : PGBinary,
@@ -82,12 +86,17 @@ pg1_colspecs[sqltypes.DateTime] = PG1DateTime
 
 pg2_ischema_names = {
     'integer' : PGInteger,
+    'bigint' : PGInteger,
     'character varying' : PGString,
     'character' : PGChar,
     'text' : PGText,
     'numeric' : PGNumeric,
+    'float' : PGFloat,
+    'real' : PGFloat,
+    'double precision' : PGFloat,
     'timestamp without time zone' : PG2DateTime,
     'bytea' : PGBinary,
+    'boolean' : PGBoolean,
 }
 pg1_ischema_names = pg2_ischema_names.copy()
 pg1_ischema_names['timestamp without time zone'] = PG1DateTime
index 1a00c555bc1a4153cd8414c97b0ac5c676556020..845efdf33a1c3533d00e4c5652dac28ee23ed9f7 100644 (file)
@@ -68,6 +68,7 @@ class SLBoolean(sqltypes.Boolean):
 colspecs = {
     sqltypes.Integer : SLInteger,
     sqltypes.Numeric : SLNumeric,
+    sqltypes.Float : SLNumeric,
     sqltypes.DateTime : SLDateTime,
     sqltypes.String : SLString,
     sqltypes.Binary : SLBinary,
@@ -82,6 +83,7 @@ pragma_names = {
     'CHAR' : SLChar,
     'TEXT' : SLText,
     'NUMERIC' : SLNumeric,
+    'FLOAT' : SLNumeric,
     'TIMESTAMP' : SLDateTime,
     'BLOB' : SLBinary,
 }
index fc29f8056dbe09de10c80e86b7cb6d6fbf4a8d86..520e379a2dec0a2dabf54b1439b0991f692aa7de 100644 (file)
@@ -17,7 +17,7 @@
 
 __all__ = [ 'TypeEngine', 'TypeDecorator', 'NullTypeEngine',
             'INT', 'CHAR', 'VARCHAR', 'TEXT', 'FLOAT', 'DECIMAL', 
-            'TIMESTAMP', 'DATETIME', 'CLOB', 'BLOB', 'BOOLEAN', 'String', 'Integer', 'Numeric', 'DateTime', 'Binary', 'Boolean', 'NULLTYPE'
+            'TIMESTAMP', 'DATETIME', 'CLOB', 'BLOB', 'BOOLEAN', 'String', 'Integer', 'Numeric', 'Float', 'DateTime', 'Binary', 'Boolean', 'NULLTYPE'
             ]
 
 
@@ -89,6 +89,12 @@ class Numeric(NullTypeEngine):
     def adapt(self, typeobj):
         return typeobj(self.precision, self.length)
 
+class Float(NullTypeEngine):
+    def __init__(self, precision = 10):
+        self.precision = precision
+    def adapt(self, typeobj):
+        return typeobj(self.precision)
+
 class DateTime(NullTypeEngine):
     pass
 
@@ -98,7 +104,7 @@ class Binary(NullTypeEngine):
 class Boolean(NullTypeEngine):
     pass
 
-class FLOAT(Numeric):pass
+class FLOAT(Float):pass
 class TEXT(String):pass
 class DECIMAL(Numeric):pass
 class INT(Integer):pass
@@ -111,4 +117,4 @@ class CHAR(String):pass
 class BLOB(Binary): pass
 class BOOLEAN(Boolean): pass
 
-NULLTYPE = NullTypeEngine()
\ No newline at end of file
+NULLTYPE = NullTypeEngine()
index 314e0eb986f18aadaad138501b4036e8af498581..c312cb177186501b639d3beac469c4840a1b84e4 100644 (file)
@@ -4,7 +4,7 @@ import unittest
 testbase.echo = False
 
 def suite():
-    modules_to_test = ('attributes', 'historyarray', 'pool', 'engines', 'query', 'types', 'mapper', 'objectstore', 'dependency', 'sequence', 'select')
+    modules_to_test = ('attributes', 'historyarray', 'pool', 'engines', 'query', 'types', 'mapper', 'objectstore', 'dependency', 'sequence', 'select', 'columns')
 #    modules_to_test = ('engines', 'mapper')
     alltests = unittest.TestSuite()
     for module in map(__import__, modules_to_test):
diff --git a/test/columns.py b/test/columns.py
new file mode 100644 (file)
index 0000000..6196e15
--- /dev/null
@@ -0,0 +1,51 @@
+from testbase import PersistTest
+import testbase
+import unittest, sys, datetime
+
+import sqlalchemy.databases.sqlite as sqllite
+
+from sqlalchemy import *
+
+class ColumnsTest(PersistTest):
+
+    defaultExpectedResults = { 'int_column': 'int_column INTEGER',
+                               'varchar_column': 'varchar_column VARCHAR(20)',
+                               'numeric_column': 'numeric_column NUMERIC(12, 3)',
+                               'float_column': 'float_column NUMERIC(25, 2)'
+                             }
+    
+    def setUp(self):
+        pass
+
+    def _buildTestTable(self):
+        testTable = Table('testColumns', self.db,
+            Column('int_column', INT),
+            Column('varchar_column', VARCHAR(20)),
+            Column('numeric_column', Numeric(12,3)),
+            Column('float_column', FLOAT(25)),
+        )
+        return testTable
+
+    def _doTest(self, expectedResults):
+        testTable = self._buildTestTable()
+        for aCol in testTable.c:
+            self.assertEquals(expectedResults[aCol.name], self.db.schemagenerator(None).get_column_specification(aCol))
+        
+    def testSqliteColumns(self):
+        self.db = create_engine('sqlite', {'filename':':memory:'})
+        self._doTest(self.defaultExpectedResults)
+
+    def testPostgresColumns(self):
+        self.db = engine.create_engine('postgres', {'database':'test', 'host':'127.0.0.1', 'user':'scott', 'password':'tiger'}, echo=False)
+        expectedResults = self.defaultExpectedResults.copy()
+        expectedResults['float_column'] = 'float_column FLOAT(25)'
+        self._doTest(expectedResults)
+
+    def testMySqlColumns(self):
+        self.db = engine.create_engine('mysql', {'db':'test', 'host':'127.0.0.1', 'user':'scott', 'passwd':'tiger'}, echo=False)
+        expectedResults = self.defaultExpectedResults.copy()
+        expectedResults['float_column'] = 'float_column FLOAT(25)'
+        self._doTest(expectedResults)
+    
+if __name__ == "__main__":
+    unittest.main()        
index d2fd10962c7655d58cb2ce12f6f013d8ccb1a2bd..c84df433e519c6bd9ef8de648f4ca17c4d4edcad 100644 (file)
@@ -17,7 +17,7 @@ class EngineTest(PersistTest):
             Column('user_id', INT, primary_key = True),
             Column('user_name', VARCHAR(20), nullable = False),
             Column('test1', CHAR(5), nullable = False),
-            Column('test2', FLOAT(5,5), nullable = False),
+            Column('test2', FLOAT(5), nullable = False),
             Column('test3', TEXT),
             Column('test4', DECIMAL, nullable = False),
             Column('test5', TIMESTAMP),