Created
March 1, 2018 12:59
-
-
Save seaders/0f668254d3a0b0bb509323898ce50288 to your computer and use it in GitHub Desktop.
Pycharm Pro SQLAlchemy fragility
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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