1111from .fields import SQLAlchemyConnectionField
1212
1313try :
14- from sqlalchemy_utils import ChoiceType , JSONType , ScalarListType
14+ from sqlalchemy_utils import ChoiceType , JSONType , ScalarListType , TSVectorType
1515except ImportError :
1616 class ChoiceType (object ):
1717 pass
@@ -23,6 +23,14 @@ class JSONType(object):
2323 pass
2424
2525
26+ def get_column_doc (column ):
27+ return getattr (column , 'doc' , None )
28+
29+
30+ def is_column_nullable (column ):
31+ return bool (getattr (column , 'nullable' , True ))
32+
33+
2634def convert_sqlalchemy_relationship (relationship , registry ):
2735 direction = relationship .direction
2836 model = relationship .mapper .entity
@@ -40,7 +48,10 @@ def dynamic_type():
4048 return Field (List (_type ))
4149
4250 return Dynamic (dynamic_type )
43-
51+
52+ def convert_sqlalchemy_hybrid_method (hybrid_item ):
53+ return String (description = getattr (hybrid_item , '__doc__' , None ),
54+ required = False )
4455
4556def convert_sqlalchemy_composite (composite , registry ):
4657 converter = registry .get_converter_for_composite (composite .composite_class )
@@ -66,6 +77,7 @@ def inner(fn):
6677 registry .register_composite_converter (cls , fn )
6778 return inner
6879
80+
6981convert_sqlalchemy_composite .register = _register_composite_class
7082
7183
@@ -80,7 +92,6 @@ def convert_sqlalchemy_type(type, column, registry=None):
8092
8193
8294@convert_sqlalchemy_type .register (types .Date )
83- @convert_sqlalchemy_type .register (types .DateTime )
8495@convert_sqlalchemy_type .register (types .Time )
8596@convert_sqlalchemy_type .register (types .String )
8697@convert_sqlalchemy_type .register (types .Text )
@@ -89,56 +100,66 @@ def convert_sqlalchemy_type(type, column, registry=None):
89100@convert_sqlalchemy_type .register (types .Enum )
90101@convert_sqlalchemy_type .register (postgresql .ENUM )
91102@convert_sqlalchemy_type .register (postgresql .UUID )
103+ @convert_sqlalchemy_type .register (TSVectorType )
92104def convert_column_to_string (type , column , registry = None ):
93- return String (description = getattr (column , 'doc' , None ),
94- required = not (getattr (column , 'nullable' , True )))
105+ return String (description = get_column_doc (column ),
106+ required = not (is_column_nullable (column )))
107+
108+
109+ @convert_sqlalchemy_type .register (types .DateTime )
110+ def convert_column_to_datetime (type , column , registry = None ):
111+ from graphene .types .datetime import DateTime
112+ return DateTime (description = get_column_doc (column ),
113+ required = not (is_column_nullable (column )))
95114
96115
97116@convert_sqlalchemy_type .register (types .SmallInteger )
98- @convert_sqlalchemy_type .register (types .BigInteger )
99117@convert_sqlalchemy_type .register (types .Integer )
100118def convert_column_to_int_or_id (type , column , registry = None ):
101119 if column .primary_key :
102- return ID (description = column . doc , required = not ( column . nullable ))
120+ return ID (description = get_column_doc ( column ) , required = not ( is_column_nullable ( column ) ))
103121 else :
104- return Int (description = column .doc , required = not (column .nullable ))
122+ return Int (description = get_column_doc (column ),
123+ required = not (is_column_nullable (column )))
105124
106125
107126@convert_sqlalchemy_type .register (types .Boolean )
108127def convert_column_to_boolean (type , column , registry = None ):
109- return Boolean (description = column . doc , required = not (column . nullable ))
128+ return Boolean (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
110129
111130
112131@convert_sqlalchemy_type .register (types .Float )
113132@convert_sqlalchemy_type .register (types .Numeric )
133+ @convert_sqlalchemy_type .register (types .BigInteger )
114134def convert_column_to_float (type , column , registry = None ):
115- return Float (description = column . doc , required = not (column . nullable ))
135+ return Float (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
116136
117137
118138@convert_sqlalchemy_type .register (ChoiceType )
119139def convert_column_to_enum (type , column , registry = None ):
120140 name = '{}_{}' .format (column .table .name , column .name ).upper ()
121- return Enum (name , type .choices , description = column . doc )
141+ return Enum (name , type .choices , description = get_column_doc ( column ) )
122142
123143
124144@convert_sqlalchemy_type .register (ScalarListType )
125145def convert_scalar_list_to_list (type , column , registry = None ):
126- return List (String , description = column . doc )
146+ return List (String , description = get_column_doc ( column ) )
127147
128148
129149@convert_sqlalchemy_type .register (postgresql .ARRAY )
130- def convert_postgres_array_to_list (type , column , registry = None ):
150+ def convert_postgres_array_to_list (_type , column , registry = None ):
131151 graphene_type = convert_sqlalchemy_type (column .type .item_type , column )
132- return List (graphene_type , description = column .doc , required = not (column .nullable ))
152+ inner_type = type (graphene_type )
153+ return List (inner_type , description = get_column_doc (column ), required = not (is_column_nullable (column )))
133154
134155
135156@convert_sqlalchemy_type .register (postgresql .HSTORE )
136157@convert_sqlalchemy_type .register (postgresql .JSON )
137158@convert_sqlalchemy_type .register (postgresql .JSONB )
138159def convert_json_to_string (type , column , registry = None ):
139- return JSONString (description = column . doc , required = not (column . nullable ))
160+ return JSONString (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
140161
141162
142163@convert_sqlalchemy_type .register (JSONType )
143164def convert_json_type_to_string (type , column , registry = None ):
144- return JSONString (description = column . doc , required = not (column . nullable ))
165+ return JSONString (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
0 commit comments