these elements are only applied when the Table
is newly created. [ticket:2109]
+- types
+ - REAL has been added to the core types. Supported
+ by Postgresql, SQL Server, MySQL, SQLite. Note
+ that the SQL Server and MySQL versions, which
+ add extra arguments, are also still available
+ from those dialects. [ticket:2081]
+
-event
- Added @event.listens_for() decorator, given
target + event name, applies the decorated
.. autoclass:: NUMERIC
:show-inheritance:
+.. autoclass:: REAL
+ :show-inheritance:
+
.. autoclass:: SMALLINT
:show-inheritance:
NUMERIC,
Numeric,
PickleType,
+ REAL,
SMALLINT,
SmallInteger,
String,
super(DOUBLE, self).__init__(precision=precision, scale=scale,
asdecimal=asdecimal, **kw)
-class REAL(_FloatType):
+class REAL(_FloatType, sqltypes.REAL):
"""Drizzle REAL type."""
__visit_name__ = 'REAL'
])
-class REAL(sqltypes.Float):
- """A type for ``real`` numbers."""
-
+class REAL(sqltypes.REAL):
__visit_name__ = 'REAL'
def __init__(self, **kw):
- kw.setdefault('precision', 24)
+ # REAL is a synonym for FLOAT(24) on SQL server
+ kw['precision'] = 24
super(REAL, self).__init__(**kw)
class TINYINT(sqltypes.Integer):
else:
return "FLOAT(%(precision)s)" % {'precision': precision}
- def visit_REAL(self, type_):
- return "REAL"
-
def visit_TINYINT(self, type_):
return "TINYINT"
super(DOUBLE, self).__init__(precision=precision, scale=scale,
asdecimal=asdecimal, **kw)
-class REAL(_FloatType):
+class REAL(_FloatType, sqltypes.REAL):
"""MySQL REAL type."""
__visit_name__ = 'REAL'
from sqlalchemy.types import INTEGER, BIGINT, SMALLINT, VARCHAR, \
CHAR, TEXT, FLOAT, NUMERIC, \
- DATE, BOOLEAN
+ DATE, BOOLEAN, REAL
RESERVED_WORDS = set(
["all", "analyse", "analyze", "and", "any", "array", "as", "asc",
_FLOAT_TYPES = (700, 701, 1021, 1022)
_INT_TYPES = (20, 21, 23, 26, 1005, 1007, 1016)
-class REAL(sqltypes.Float):
- __visit_name__ = "REAL"
-
class BYTEA(sqltypes.LargeBinary):
__visit_name__ = 'BYTEA'
def visit_BYTEA(self, type_):
return "BYTEA"
- def visit_REAL(self, type_):
- return "REAL"
-
def visit_ARRAY(self, type_):
return self.process(type_.item_type) + '[]'
from sqlalchemy.dialects.sqlite.base import \
- BLOB, BOOLEAN, CHAR, DATE, DATETIME, DECIMAL, FLOAT, INTEGER,\
+ BLOB, BOOLEAN, CHAR, DATE, DATETIME, DECIMAL, FLOAT, INTEGER, REAL,\
NUMERIC, SMALLINT, TEXT, TIME, TIMESTAMP, VARCHAR, dialect
__all__ = (
'BLOB', 'BOOLEAN', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'FLOAT', 'INTEGER',
- 'NUMERIC', 'SMALLINT', 'TEXT', 'TIME', 'TIMESTAMP', 'VARCHAR', 'dialect'
+ 'NUMERIC', 'SMALLINT', 'TEXT', 'TIME', 'TIMESTAMP', 'VARCHAR', 'dialect', 'REAL'
)
\ No newline at end of file
from sqlalchemy import processors
from sqlalchemy.types import BLOB, BOOLEAN, CHAR, DATE, DATETIME, DECIMAL,\
- FLOAT, INTEGER, NUMERIC, SMALLINT, TEXT, TIME,\
- TIMESTAMP, VARCHAR
+ FLOAT, REAL, INTEGER, NUMERIC, SMALLINT, TEXT, TIME, TIMESTAMP, VARCHAR
class _DateTimeMixin(object):
_reg = None
'INT': sqltypes.INTEGER,
'INTEGER': sqltypes.INTEGER,
'NUMERIC': sqltypes.NUMERIC,
- 'REAL': sqltypes.Numeric,
+ 'REAL': sqltypes.REAL,
'SMALLINT': sqltypes.SMALLINT,
'TEXT': sqltypes.TEXT,
'TIME': sqltypes.TIME,
def visit_FLOAT(self, type_):
return "FLOAT"
+ def visit_REAL(self, type_):
+ return "REAL"
+
def visit_NUMERIC(self, type_):
if type_.precision is None:
return "NUMERIC"
def visit_integer(self, type_):
return self.visit_INTEGER(type_)
+ def visit_real(self, type_):
+ return self.visit_REAL(type_)
+
def visit_float(self, type_):
return self.visit_FLOAT(type_)
"""
__all__ = [ 'TypeEngine', 'TypeDecorator', 'AbstractType', 'UserDefinedType',
'INT', 'CHAR', 'VARCHAR', 'NCHAR', 'NVARCHAR','TEXT', 'Text',
- 'FLOAT', 'NUMERIC', 'DECIMAL', 'TIMESTAMP', 'DATETIME', 'CLOB',
- 'BLOB', 'BOOLEAN', 'SMALLINT', 'INTEGER', 'DATE', 'TIME',
+ 'FLOAT', 'NUMERIC', 'REAL', 'DECIMAL', 'TIMESTAMP', 'DATETIME',
+ 'CLOB', 'BLOB', 'BOOLEAN', 'SMALLINT', 'INTEGER', 'DATE', 'TIME',
'String', 'Integer', 'SmallInteger', 'BigInteger', 'Numeric',
'Float', 'DateTime', 'Date', 'Time', 'LargeBinary', 'Binary',
'Boolean', 'Unicode', 'MutableType', 'Concatenable',
return self.impl._coerce_compared_value(op, value)
+class REAL(Float):
+ """The SQL REAL type."""
+
+ __visit_name__ = 'REAL'
+
class FLOAT(Float):
"""The SQL FLOAT type."""
metadata = self.metadata
t1 = Table('t', metadata,
Column('x', postgresql.ARRAY(Float)),
- Column('y', postgresql.ARRAY(postgresql.REAL)),
+ Column('y', postgresql.ARRAY(REAL)),
Column('z', postgresql.ARRAY(postgresql.DOUBLE_PRECISION)),
Column('q', postgresql.ARRAY(Numeric))
)
for dialect in self._all_dialects():
for type_, expected in (
+ (REAL, "REAL"),
(FLOAT, "FLOAT"),
(NUMERIC, "NUMERIC"),
(DECIMAL, "DECIMAL"),
for k in t1.__dict__:
if k == 'impl':
continue
- eq_(getattr(t2, k), t1.__dict__[k])
+ # assert each value was copied, or that
+ # the adapted type has a more specific
+ # value than the original (i.e. SQL Server
+ # applies precision=24 for REAL)
+ assert \
+ getattr(t2, k) == t1.__dict__[k] or \
+ t1.__dict__[k] is None
def test_plain_init_deprecation_warning(self):
for typ in (Integer, Date, SmallInteger):