diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-12-08 20:21:02 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-12-08 20:21:02 +0000 |
| commit | 082d5db64f85828f219b6c4321208f1b093a02ce (patch) | |
| tree | dd3ac09d62c2758fbccadea06ac888913776f80a /lib/sqlalchemy | |
| parent | 4c4568eeb86380cabcbf09ac0ad7df2f9d5823a1 (diff) | |
| download | sqlalchemy-082d5db64f85828f219b6c4321208f1b093a02ce.tar.gz | |
- removed redundant declarative docs
- cleanup of metadata/foreignkey docs
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/ext/declarative.py | 102 | ||||
| -rw-r--r-- | lib/sqlalchemy/schema.py | 49 |
2 files changed, 95 insertions, 56 deletions
diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index 37fa98d78..50f8f24e6 100644 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -1,8 +1,11 @@ """A simple declarative layer for SQLAlchemy ORM. +Synopsis +======== + SQLAlchemy object-relational configuration involves the usage of Table, mapper(), and class objects to define the three areas of configuration. -declarative moves these three types of configuration underneath the individual +``declarative`` moves these three types of configuration underneath the individual mapped class. Regular SQLAlchemy schema and ORM constructs are used in most cases:: @@ -12,16 +15,30 @@ cases:: class SomeClass(Base): __tablename__ = 'some_table' - id = Column('id', Integer, primary_key=True) - name = Column('name', String(50)) + id = Column(Integer, primary_key=True) + name = Column(String(50)) Above, the ``declarative_base`` callable produces a new base class from which all mapped classes inherit from. When the class definition is completed, a new ``Table`` and ``mapper()`` have been generated, accessible via the ``__table__`` and ``__mapper__`` attributes on the ``SomeClass`` class. -You may omit the names from the Column definitions. Declarative will fill -them in for you:: +Defining Attributes +=================== + +:class:`~sqlalchemy.schema.Column` objects may be explicitly named, +including using a different name than the attribute in which they are associated. +The column will be assigned to the :class:`~sqlalchemy.schema.Table` using the +given name, and mapped to the class using the attribute name:: + + class SomeClass(Base): + __tablename__ = 'some_table' + id = Column("some_table_id", Integer, primary_key=True) + name = Column("name", String(50)) + +Otherwise, you may omit the names from the Column definitions. +Declarative will set the ``name`` attribute on the column when the class +is initialized:: class SomeClass(Base): __tablename__ = 'some_table' @@ -29,14 +46,19 @@ them in for you:: name = Column(String(50)) Attributes may be added to the class after its construction, and they will be -added to the underlying ``Table`` and ``mapper()`` definitions as +added to the underlying :class:`~sqlalchemy.schema.Table` and :func:`~sqlalchemy.orm.mapper()` definitions as appropriate:: SomeClass.data = Column('data', Unicode) SomeClass.related = relation(RelatedInfo) -Classes which are mapped explicitly using ``mapper()`` can interact freely -with declarative classes. +Classes which are mapped explicitly using :func:`~sqlalchemy.orm.mapper()` can interact freely +with declarative classes. It is recommended, though not required, that all tables +share the same underlying :class:`~sqlalchemy.schema.MetaData` object, so that +string-configured :class:`~sqlalchemy.schema.ForeignKey` references can be resolved without issue. + +Association of Metadata and Engine +================================== The ``declarative_base`` base class contains a ``MetaData`` object where newly defined ``Table`` objects are collected. This is accessed via the @@ -64,6 +86,9 @@ traditional collection of ``Table`` objects:: mymetadata = MetaData() Base = declarative_base(metadata=mymetadata) +Configuring Relations +===================== + Relations to other classes are done in the usual way, with the added feature that the class specified to ``relation()`` may be a string name. The "class registry" associated with ``Base`` is used at mapper compilation time to @@ -114,9 +139,12 @@ class after the fact:: User.addresses = relation(Address, primaryjoin=Address.user_id == User.id) -Synonyms are one area where ``declarative`` needs to slightly change the usual -SQLAlchemy configurational syntax. To define a getter/setter which proxies to -an underlying attribute, use ``synonym`` with the ``descriptor`` argument:: +Defining Synonyms +================= + +Synonyms are introduced in :ref:`synonyms`. To define a getter/setter which +proxies to an underlying attribute, use ``synonym`` with the +``descriptor`` argument:: class MyClass(Base): __tablename__ = 'sometable' @@ -125,7 +153,7 @@ an underlying attribute, use ``synonym`` with the ``descriptor`` argument:: def _get_attr(self): return self._some_attr - def _set_attr(self, attr) + def _set_attr(self, attr): self._some_attr = attr attr = synonym('_attr', descriptor=property(_get_attr, _set_attr)) @@ -136,7 +164,8 @@ class-level expression construct:: x.attr = "some value" session.query(MyClass).filter(MyClass.attr == 'some other value').all() -The `synonym_for` decorator can accomplish the same task:: +For simple getters, the :func:`synonym_for` decorator can be used in conjunction +with ``@property``:: class MyClass(Base): __tablename__ = 'sometable' @@ -148,7 +177,8 @@ The `synonym_for` decorator can accomplish the same task:: def attr(self): return self._some_attr -Similarly, `comparable_using` is a front end for the `comparable_property` ORM function:: +Similarly, :func:`comparable_using` is a front end for the :func:`~sqlalchemy.orm.comparable_property` +ORM function:: class MyClass(Base): __tablename__ = 'sometable' @@ -160,6 +190,9 @@ Similarly, `comparable_using` is a front end for the `comparable_property` ORM f def uc_name(self): return self.name.upper() +Table Configuration +=================== + As an alternative to ``__tablename__``, a direct ``Table`` construct may be used. The ``Column`` objects, which in this case require their names, will be added to the mapping just like a regular mapping to a table:: @@ -173,17 +206,20 @@ added to the mapping just like a regular mapping to a table:: Other table-based attributes include ``__table_args__``, which is either a dictionary as in:: - class MyClass(Base) + class MyClass(Base): __tablename__ = 'sometable' __table_args__ = {'mysql_engine':'InnoDB'} or a dictionary-containing tuple in the form ``(arg1, arg2, ..., {kwarg1:value, ...})``, as in:: - class MyClass(Base) + class MyClass(Base): __tablename__ = 'sometable' __table_args__ = (ForeignKeyConstraint(['id'], ['remote_table.id']), {'autoload':True}) +Mapper Configuration +==================== + Mapper arguments are specified using the ``__mapper_args__`` class variable. Note that the column objects declared on the class are immediately usable, as in this joined-table inheritance example:: @@ -470,44 +506,44 @@ def declarative_base(bind=None, metadata=None, mapper=None, cls=object, """Construct a base class for declarative class definitions. The new base class will be given a metaclass that invokes - `instrument_declarative()` upon each subclass definition, and routes + :func:`instrument_declarative()` upon each subclass definition, and routes later Column- and Mapper-related attribute assignments made on the class - into Table and Mapper assignments. See the `declarative` module - documentation for examples. + into Table and Mapper assignments. - bind - An optional `Connectable`, will be assigned to the `metadata.bind`. + :param bind: An optional :class:`~sqlalchemy.engine.base.Connectable`, will be assigned + the ``bind`` attribute on the :class:`~sqlalchemy.schema.MetaData` instance. The `engine` keyword argument is a deprecated synonym for `bind`. - metadata - An optional `MetaData` instance. All Tables implicitly declared by + :param metadata: + An optional :class:`~sqlalchemy.schema.MetaData` instance. All :class:`~sqlalchemy.schema.Table` + objects implicitly declared by subclasses of the base will share this MetaData. A MetaData instance will be create if none is provided. The MetaData instance will be available via the `metadata` attribute of the generated declarative base class. - mapper - An optional callable, defaults to `sqlalchemy.orm.mapper`. Will be + :param mapper: + An optional callable, defaults to :func:`~sqlalchemy.orm.mapper`. Will be used to map subclasses to their Tables. - cls - Defaults to `object`. A type to use as the base for the generated + :param cls: + Defaults to :class:`object`. A type to use as the base for the generated declarative base class. May be a type or tuple of types. - name - Defaults to 'Base', Python's internal display name for the generated + :param name: + Defaults to ``Base``. The display name for the generated class. Customizing this is not required, but can improve clarity in tracebacks and debugging. - constructor + :param constructor: Defaults to declarative._declarative_constructor, an __init__ implementation that assigns \**kwargs for declared fields and relations - to an instance. If `None` is supplied, no __init__ will be installed + to an instance. If ``None`` is supplied, no __init__ will be installed and construction will fall back to cls.__init__ with normal Python semantics. - metaclass - Defaults to `DeclarativeMeta`. A metaclass or __metaclass__ + :param metaclass: + Defaults to :class:`DeclarativeMeta`. A metaclass or __metaclass__ compatible callable to use as the meta type of the generated declarative base class. diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index aeb7d61af..c96d8adf4 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -749,51 +749,51 @@ class Column(SchemaItem, expression.ColumnClause): class ForeignKey(SchemaItem): """Defines a column-level FOREIGN KEY constraint between two columns. - ``ForeignKey`` is specified as an argument to a ``Column`` object. + ``ForeignKey`` is specified as an argument to a :class:`Column` object, e.g.:: + + t = Table("remote_table", metadata, + Column("remote_id", ForeignKey("main_table.id")) + ) - For a composite (multiple column) FOREIGN KEY, use a ForeignKeyConstraint - within the Table definition. + For a composite (multiple column) FOREIGN KEY, use a :class:`ForeignKeyConstraint` + object specified at the level of the :class:`Table`. + + Further examples of foreign key configuration are in :ref:`metadata_foreignkeys`. """ def __init__(self, column, constraint=None, use_alter=False, name=None, onupdate=None, ondelete=None, deferrable=None, initially=None): - """Construct a column-level FOREIGN KEY. + """ + Construct a column-level FOREIGN KEY. - column - A single target column for the key relationship. A ``Column`` + :param column: A single target column for the key relationship. A :class:`Column` object or a column name as a string: ``tablename.columnname`` or ``schema.tablename.columnname``. - constraint - Optional. A parent ``ForeignKeyConstraint`` object. If not - supplied, a ``ForeignKeyConstraint`` will be automatically created + :param constraint: Optional. A parent :class:`ForeignKeyConstraint` object. If not + supplied, a :class:`ForeignKeyConstraint` will be automatically created and added to the parent table. - name - Optional string. An in-database name for the key if `constraint` is + :param name: Optional string. An in-database name for the key if `constraint` is not provided. - onupdate - Optional string. If set, emit ON UPDATE <value> when issuing DDL + :param onupdate: Optional string. If set, emit ON UPDATE <value> when issuing DDL for this constraint. Typical values include CASCADE, DELETE and RESTRICT. - ondelete - Optional string. If set, emit ON DELETE <value> when issuing DDL + :param ondelete: Optional string. If set, emit ON DELETE <value> when issuing DDL for this constraint. Typical values include CASCADE, DELETE and RESTRICT. - deferrable - Optional bool. If set, emit DEFERRABLE or NOT DEFERRABLE when + :param deferrable: Optional bool. If set, emit DEFERRABLE or NOT DEFERRABLE when issuing DDL for this constraint. - initially - Optional string. If set, emit INITIALLY <value> when issuing DDL + :param initially: Optional string. If set, emit INITIALLY <value> when issuing DDL for this constraint. - use_alter - If True, do not emit this key as part of the CREATE TABLE + :param use_alter: If True, do not emit this key as part of the CREATE TABLE definition. Instead, use ALTER TABLE after table creation to add the key. Useful for circular dependencies. + """ self._colspec = column @@ -1169,8 +1169,11 @@ class ForeignKeyConstraint(Constraint): Defines a single column or composite FOREIGN KEY ... REFERENCES constraint. For a no-frills, single column foreign key, adding a - ``ForeignKey`` to the definition of a ``Column`` is a shorthand equivalent - for an unnamed, single column ``ForeignKeyConstraint``. + :class:`ForeignKey` to the definition of a :class:`Column` is a shorthand equivalent + for an unnamed, single column :class:`ForeignKeyConstraint`. + + Examples of foreign key configuration are in :ref:`metadata_foreignkeys`. + """ def __init__(self, columns, refcolumns, name=None, onupdate=None, ondelete=None, use_alter=False, deferrable=None, initially=None): |
