interfaces
is a callable within the sqlalchemy.orm
module of the SQLAlchemy project.
ColumnProperty,
CompositeProperty,
Load,
Mapper,
Query,
RelationshipProperty,
Session,
SynonymProperty,
aliased,
attributes,
backref,
class_mapper,
column_property,
composite,
mapper,
mapperlib,
object_mapper,
object_session,
query,
relationship,
session,
sessionmaker,
and strategies
are several other callables with code examples from the same sqlalchemy.orm
package.
graphene-sqlalchemy (project documentation and PyPI package information) is a SQLAlchemy integration for Graphene, which makes it easier to build GraphQL-based APIs into Python web applications. The package allows you to subclass SQLAlchemy classes and build queries around them with custom code to match the backend queries with the GraphQL-based request queries. The project is provided as open source under the MIT license.
graphene-sqlalchemy / graphene_sqlalchemy / converter.py
# converter.py
from enum import EnumMeta
from singledispatch import singledispatch
from sqlalchemy import types
from sqlalchemy.dialects import postgresql
from sqlalchemy.orm import interfaces, strategies
from graphene import (ID, Boolean, Dynamic, Enum, Field, Float, Int, List,
String)
from graphene.types.json import JSONString
from .batching import get_batch_resolver
from .enums import enum_for_sa_enum
from .fields import (BatchSQLAlchemyConnectionField,
default_connection_field_factory)
from .registry import get_global_registry
from .resolvers import get_attr_resolver, get_custom_resolver
try:
from sqlalchemy_utils import ChoiceType, JSONType, ScalarListType, TSVectorType
except ImportError:
ChoiceType = JSONType = ScalarListType = TSVectorType = object
is_selectin_available = getattr(strategies, 'SelectInLoader', None)
def get_column_doc(column):
return getattr(column, "doc", None)
def is_column_nullable(column):
return bool(getattr(column, "nullable", True))
def convert_sqlalchemy_relationship(relationship_prop, obj_type, connection_field_factory, batching,
orm_field_name, **field_kwargs):
def dynamic_type():
direction = relationship_prop.direction
child_type = obj_type._meta.registry.get_type_for_model(relationship_prop.mapper.entity)
batching_ = batching if is_selectin_available else False
if not child_type:
return None
if direction == interfaces.MANYTOONE or not relationship_prop.uselist:
return _convert_o2o_or_m2o_relationship(relationship_prop, obj_type, batching_, orm_field_name,
**field_kwargs)
if direction in (interfaces.ONETOMANY, interfaces.MANYTOMANY):
return _convert_o2m_or_m2m_relationship(relationship_prop, obj_type, batching_,
connection_field_factory, **field_kwargs)
return Dynamic(dynamic_type)
def _convert_o2o_or_m2o_relationship(relationship_prop, obj_type, batching, orm_field_name, **field_kwargs):
child_type = obj_type._meta.registry.get_type_for_model(relationship_prop.mapper.entity)
resolver = get_custom_resolver(obj_type, orm_field_name)
if resolver is None:
resolver = get_batch_resolver(relationship_prop) if batching else \
get_attr_resolver(obj_type, relationship_prop.key)
return Field(child_type, resolver=resolver, **field_kwargs)
def _convert_o2m_or_m2m_relationship(relationship_prop, obj_type, batching, connection_field_factory, **field_kwargs):
child_type = obj_type._meta.registry.get_type_for_model(relationship_prop.mapper.entity)
if not child_type._meta.connection:
return Field(List(child_type), **field_kwargs)
if connection_field_factory is None:
## ... source file continues with no further interfaces examples...