Skip to content

Instantly share code, notes, and snippets.

@plq
Created June 18, 2011 13:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save plq/1033106 to your computer and use it in GitHub Desktop.
Save plq/1033106 to your computer and use it in GitHub Desktop.
Foreign keys in object mixins
Traceback (most recent call last):
File "sqla_mixin.py", line 45, in <module>
DeclarativeBase.metadata.create_all(engine)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/schema.py", line 2415, in create_all
tables=tables)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 2178, in _run_visitor
conn._run_visitor(visitorcallable, element, **kwargs)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1857, in _run_visitor
**kwargs).traverse_single(element)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/visitors.py", line 86, in traverse_single
return meth(obj, **kw)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/ddl.py", line 65, in visit_metadata
self.traverse_single(table, create_ok=True)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/visitors.py", line 86, in traverse_single
return meth(obj, **kw)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/ddl.py", line 82, in visit_table
self.connection.execute(schema.CreateTable(table))
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1358, in execute
params)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 1443, in _execute_ddl
compiled = ddl.compile(dialect=dialect)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/expression.py", line 1643, in compile
return self._compiler(dialect, bind=bind, **kw)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/schema.py", line 2752, in _compiler
return dialect.ddl_compiler(dialect, self, **kw)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 699, in __init__
self.string = self.process(self.statement)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 718, in process
return obj._compiler_dispatch(self, **kwargs)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/visitors.py", line 59, in _compiler_dispatch
return getter(visitor)(self, **kw)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/compiler.py", line 1278, in visit_create_table
const = self.create_table_constraints(table)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/compiler.py", line 1298, in create_table_constraints
for constraint in constraints
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/compiler.py", line 1296, in <genexpr>
return ", \n\t".join(p for p in
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/compiler.py", line 1304, in <genexpr>
not getattr(constraint, 'use_alter', False)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/engine/base.py", line 718, in process
return obj._compiler_dispatch(self, **kwargs)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/sql/visitors.py", line 59, in _compiler_dispatch
return getter(visitor)(self, **kw)
File "/home/plq/src/sqlalchemy/lib/sqlalchemy/dialects/sqlite/base.py", line 377, in visit_foreign_key_constraint
if local_table.schema != remote_table.schema:
AttributeError: 'NoneType' object has no attribute 'schema'
#!/usr/bin/python
from sqlalchemy import Integer
from sqlalchemy import UniqueConstraint
from sqlalchemy import ForeignKey
from sqlalchemy import Column
from sqlalchemy import Unicode
from sqlalchemy import Boolean
from sqlalchemy.orm import mapper
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.declarative import declarative_base
DeclarativeBase = declarative_base()
class DomainMixin(object):
id = Column(Integer, primary_key=True)
domain_name = Column(Unicode(255), unique=True)
active = Column(Boolean)
class UserMixin(object):
__table_args__ = (
UniqueConstraint('user_name', 'domain_id'),
)
id = Column(Integer, primary_key=True)
@declared_attr
def domain_id(cls):
return Column(Integer, ForeignKey(DomainMixin.id))
user_name = Column(Unicode(64))
class Domain(DeclarativeBase, DomainMixin):
__tablename__='domain'
class User(DeclarativeBase, UserMixin):
__tablename__='user'
if __name__ == '__main__':
engine = create_engine('sqlite:///:memory:')
DeclarativeBase.metadata.create_all(engine)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment