Skip to content

Instantly share code, notes, and snippets.

@seaders
Created March 1, 2018 12:59
Show Gist options
  • Save seaders/0f668254d3a0b0bb509323898ce50288 to your computer and use it in GitHub Desktop.
Save seaders/0f668254d3a0b0bb509323898ce50288 to your computer and use it in GitHub Desktop.
Pycharm Pro SQLAlchemy fragility
import weakref
from sqlalchemy import \
Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.ext.declarative import \
declarative_base, DeclarativeMeta, declared_attr
from sqlalchemy.orm import \
relationship
# noinspection PyProtectedMember
from sqlalchemy.ext.declarative.api import \
_declarative_constructor
db_Column = Column
db_Integer = Integer
Model = declarative_base()
class Person(Model):
__tablename__ = 'person'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
age2 = Column(db_Integer)
age3 = db_Column(db_Integer)
Person()
class Account(Model):
__tablename__ = 'account'
id = Column(Integer, primary_key=True)
class LBBAccountStratMixin:
@declared_attr
def account_id(self):
return Column(Integer, ForeignKey(Account.id))
@declared_attr
def account(self):
return relationship(Account, self.account_id)
class LBBAccountStratNullableMixin(LBBAccountStratMixin):
@declared_attr
def account_id(self):
return Column(Integer, ForeignKey(Account.id), nullable=True)
class Person2(LBBAccountStratNullableMixin, Model):
__tablename__ = 'person2'
id = Column(Integer, primary_key=True)
name = Column(String)
Person2(id=3, name='asdf', account_id=2)
class DeclarativeMeta2(DeclarativeMeta):
pass
def declarative_base2(bind=None, metadata=None, mapper=None, cls=object,
name='Base', constructor=_declarative_constructor,
class_registry=None,
metaclass=DeclarativeMeta2):
lcl_metadata = metadata or MetaData()
if bind:
lcl_metadata.bind = bind
if class_registry is None:
class_registry = weakref.WeakValueDictionary()
bases = not isinstance(cls, tuple) and (cls,) or cls
class_dict = dict(_decl_class_registry=class_registry,
metadata=lcl_metadata)
if isinstance(cls, type):
class_dict['__doc__'] = cls.__doc__
if constructor:
class_dict['__init__'] = constructor
if mapper:
class_dict['__mapper_cls__'] = mapper
return metaclass(name, bases, class_dict)
Model2 = declarative_base2()
class Person3(Model2):
__tablename__ = 'person3'
id = Column(Integer, primary_key=True)
name = Column(String)
Person3()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment