diff options
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r-- | lib/sqlalchemy/dialects/sqlite/base.py | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index b50170759..312188f96 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -1366,14 +1366,19 @@ class SQLiteDialect(default.DefaultDialect): FK_PATTERN = ( '(?:CONSTRAINT (\w+) +)?' 'FOREIGN KEY *\( *(.+?) *\) +' - 'REFERENCES +(?:(?:"(.+?)")|([a-z0-9_]+)) *\((.+?)\)' + 'REFERENCES +(?:(?:"(.+?)")|([a-z0-9_]+)) *\((.+?)\) *' + '(?:ON DELETE ' + '(SET NULL|SET DEFAULT|CASCADE|RESTRICT|NO ACTION) *)?' + '(?:ON UPDATE ' + '(SET NULL|SET DEFAULT|CASCADE|RESTRICT|NO ACTION))?' ) for match in re.finditer(FK_PATTERN, table_data, re.I): ( constraint_name, constrained_columns, referred_quoted_name, referred_name, - referred_columns) = match.group(1, 2, 3, 4, 5) + referred_columns, ondelete, + onupdate) = match.group(1, 2, 3, 4, 5, 6, 7) constrained_columns = list( self._find_cols_in_sig(constrained_columns)) if not referred_columns: @@ -1382,14 +1387,19 @@ class SQLiteDialect(default.DefaultDialect): referred_columns = list( self._find_cols_in_sig(referred_columns)) referred_name = referred_quoted_name or referred_name + options = {} + if ondelete: + options['ondelete'] = ondelete + if onupdate: + options['onupdate'] = onupdate yield ( constraint_name, constrained_columns, - referred_name, referred_columns) + referred_name, referred_columns, options) fkeys = [] for ( constraint_name, constrained_columns, - referred_name, referred_columns) in parse_fks(): + referred_name, referred_columns, options) in parse_fks(): sig = fk_sig( constrained_columns, referred_name, referred_columns) if sig not in keys_by_signature: @@ -1403,6 +1413,8 @@ class SQLiteDialect(default.DefaultDialect): continue key = keys_by_signature.pop(sig) key['name'] = constraint_name + if options: + key['options'] = options fkeys.append(key) # assume the remainders are the unnamed, inline constraints, just # use them as is as it's extremely difficult to parse inline |