11from sqlalchemy .dialects .postgresql .psycopg2 import PGDialect_psycopg2
22from sqlalchemy .engine import reflection
3+ from sqlalchemy import util , exc
34
45class RedshiftDialect (PGDialect_psycopg2 ):
56 @reflection .cache
@@ -16,7 +17,29 @@ def get_indexes(self, connection, table_name, schema, **kw):
1617 """
1718 return []
1819
20+ #def set_isolation_level(self, connection, level):
21+ # from psycopg2 import extensions
22+ # connection.set_isolation_level(extensions.ISOLATION_LEVEL_AUTOCOMMIT)
23+
24+ @util .memoized_property
25+ def _isolation_lookup (self ):
26+ extensions = __import__ ('psycopg2.extensions' ).extensions
27+ return {
28+ 'READ COMMITTED' : extensions .ISOLATION_LEVEL_READ_COMMITTED ,
29+ 'READ UNCOMMITTED' : extensions .ISOLATION_LEVEL_READ_UNCOMMITTED ,
30+ 'REPEATABLE READ' : extensions .ISOLATION_LEVEL_REPEATABLE_READ ,
31+ 'SERIALIZABLE' : extensions .ISOLATION_LEVEL_SERIALIZABLE ,
32+ 'AUTOCOMMIT' : extensions .ISOLATION_LEVEL_AUTOCOMMIT
33+ }
34+
1935 def set_isolation_level (self , connection , level ):
20- from psycopg2 import extensions
21- connection .set_isolation_level (extensions .ISOLATION_LEVEL_AUTOCOMMIT )
36+ try :
37+ level = self ._isolation_lookup [level .replace ('_' , ' ' )]
38+ except KeyError :
39+ raise exc .ArgumentError (
40+ "Invalid value '%s' for isolation_level. "
41+ "Valid isolation levels for %s are %s" %
42+ (level , self .name , ", " .join (self ._isolation_lookup ))
43+ )
2244
45+ connection .set_isolation_level (level )
0 commit comments