summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/databases/mysql.py5
-rw-r--r--lib/sqlalchemy/databases/postgres.py46
-rw-r--r--lib/sqlalchemy/databases/sqlite.py5
3 files changed, 33 insertions, 23 deletions
diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py
index 662d276e9..b87e2d6e9 100644
--- a/lib/sqlalchemy/databases/mysql.py
+++ b/lib/sqlalchemy/databases/mysql.py
@@ -29,7 +29,10 @@ class MSNumeric(sqltypes.Numeric):
self.zerofill = 'zerofill' in kw
super(MSNumeric, self).__init__(precision, length)
def get_col_spec(self):
- return kw_colspec(self, "NUMERIC(%(precision)s, %(length)s)" % {'precision': self.precision, 'length' : self.length})
+ if self.precision is None:
+ return kw_colspec(self, "NUMERIC")
+ else:
+ return kw_colspec(self, "NUMERIC(%(precision)s, %(length)s)" % {'precision': self.precision, 'length' : self.length})
class MSDecimal(MSNumeric):
def get_col_spec(self):
if self.precision is not None and self.length is not None:
diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py
index 5c78e2f52..a3ecab825 100644
--- a/lib/sqlalchemy/databases/postgres.py
+++ b/lib/sqlalchemy/databases/postgres.py
@@ -34,10 +34,16 @@ except:
class PGNumeric(sqltypes.Numeric):
def get_col_spec(self):
- return "NUMERIC(%(precision)s, %(length)s)" % {'precision': self.precision, 'length' : self.length}
+ if not self.precision:
+ return "NUMERIC"
+ else:
+ 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}
+ if not self.precision:
+ return "FLOAT"
+ else:
+ return "FLOAT(%(precision)s)" % {'precision': self.precision}
class PGInteger(sqltypes.Integer):
def get_col_spec(self):
return "INTEGER"
@@ -345,24 +351,29 @@ class PGDialect(ansisql.ANSIDialect):
try:
charlen = re.search('\(([\d,]+)\)',row['format_type']).group(1)
except:
- charlen = None
+ charlen = False
- numericprec = None
- numericscale = None
+ numericprec = False
+ numericscale = False
default = row['default']
if attype == 'numeric':
- numericprec, numericscale = charlen.split(',')
- charlen = None
+ if charlen is False:
+ numericprec, numericscale = (None, None)
+ else:
+ numericprec, numericscale = charlen.split(',')
+ charlen = False
if attype == 'double precision':
numericprec, numericscale = (53, None)
- charlen = None
+ charlen = False
if attype == 'integer':
numericprec, numericscale = (32, 0)
- charlen = None
+ charlen = False
args = []
for a in (charlen, numericprec, numericscale):
- if a is not None:
+ if a is None:
+ args.append(None)
+ elif a is not False:
args.append(int(a))
kwargs = {}
@@ -421,22 +432,15 @@ class PGDialect(ansisql.ANSIDialect):
if row is None:
break
- identifier = '(?:[a-z_][a-z0-9_$]+|"(?:[^"]|"")+")'
- identifier_group = '%s(?:, %s)*' % (identifier, identifier)
- identifiers = '(%s)(?:, (%s))*' % (identifier, identifier)
- f = re.compile(identifiers)
- # FOREIGN KEY (mail_user_id,"Mail_User_ID2") REFERENCES "mYschema".euro_user(user_id,"User_ID2")
- foreign_key_pattern = 'FOREIGN KEY \((%s)\) REFERENCES (?:(%s)\.)?(%s)\((%s)\)' % (identifier_group, identifier, identifier, identifier_group)
- p = re.compile(foreign_key_pattern)
-
- m = p.search(row['condef'])
+ foreign_key_pattern = 'FOREIGN KEY \((.*?)\) REFERENCES (?:(.*?)\.)?(.*?)\((.*?)\)'
+ m = re.search(foreign_key_pattern, row['condef'])
(constrained_columns, referred_schema, referred_table, referred_columns) = m.groups()
- constrained_columns = [preparer._unquote_identifier(x) for x in f.search(constrained_columns).groups() if x]
+ constrained_columns = [preparer._unquote_identifier(x) for x in re.split(r'\s*,\s*', constrained_columns)]
if referred_schema:
referred_schema = preparer._unquote_identifier(referred_schema)
referred_table = preparer._unquote_identifier(referred_table)
- referred_columns = [preparer._unquote_identifier(x) for x in f.search(referred_columns).groups() if x]
+ referred_columns = [preparer._unquote_identifier(x) for x in re.split(r'\s*,\s', referred_columns)]
refspec = []
if referred_schema is not None:
diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py
index 4eee8e4d0..6300250b3 100644
--- a/lib/sqlalchemy/databases/sqlite.py
+++ b/lib/sqlalchemy/databases/sqlite.py
@@ -27,7 +27,10 @@ except ImportError:
class SLNumeric(sqltypes.Numeric):
def get_col_spec(self):
- return "NUMERIC(%(precision)s, %(length)s)" % {'precision': self.precision, 'length' : self.length}
+ if self.precision is None:
+ return "NUMERIC"
+ else:
+ return "NUMERIC(%(precision)s, %(length)s)" % {'precision': self.precision, 'length' : self.length}
class SLInteger(sqltypes.Integer):
def get_col_spec(self):
return "INTEGER"