From 0f6c5a8764d2a4d25aa0cf3f2e346d33daca9c10 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 24 Jan 2012 17:20:28 -0500 Subject: [PATCH] documentation including an API diagram --- alembic/environment.py | 34 +- alembic/operations.py | 16 +- docs/build/api.rst | 50 +- docs/build/api_overview.png | Bin 0 -> 62197 bytes docs/build/assets/api_overview.graffle | 1181 ++++++++++++++++++++++++ docs/build/ops.rst | 20 +- 6 files changed, 1273 insertions(+), 28 deletions(-) create mode 100644 docs/build/api_overview.png create mode 100644 docs/build/assets/api_overview.graffle diff --git a/alembic/environment.py b/alembic/environment.py index 716de62..d562add 100644 --- a/alembic/environment.py +++ b/alembic/environment.py @@ -5,7 +5,15 @@ from contextlib import contextmanager class EnvironmentContext(object): - """Represent the state made available to an env.py script.""" + """Represent the state made available to an ``env.py`` script. + + :class:`.EnvironmentContext` is normally instantiated + by the commands present in the :mod:`alembic.command` + module. From within an ``env.py`` script, the current + :class:`.EnvironmentContext` is available via the + ``alembic.context`` datamember. + + """ _migration_context = None _default_opts = None @@ -150,11 +158,20 @@ def configure(self, sqlalchemy_module_prefix="sa.", **kw ): - """Configure the migration environment. - - The important thing needed here is first a way to figure out - what kind of "dialect" is in use. The second is to pass - an actual database connection, if one is required. + """Configure a :class:`.MigrationContext` within this + :class:`.EnvironmentContext` which will provide database connectivity + and other configuration to a series of migration scripts. + + Many methods on :class:`.EnvironmentContext` require that + this method has been called in order to function, as they + ultimately need to have database access or at least access + to the dialect in use. Those which do are documented as such. + + The important thing needed by :meth:`.configure` is a + means to determine what kind of database dialect is in use. + An actual connection to that database is needed only if + the :class:`.MigrationContext` is to be used in + "online" mode. If the :meth:`.is_offline_mode` function returns ``True``, then no connection is needed here. Otherwise, the @@ -420,11 +437,6 @@ def migration_context(self): If :meth:`.EnvironmentContext.configure` has not been called yet, raises an exception. - Generally, env.py scripts should access this via - the ``alembic.context`` object, which is an instance of - :class:`.MigrationContext` placed there for the duration - of the env.py script's usage. - """ if self._migration_context is None: raise Exception("No context has been configured yet.") diff --git a/alembic/operations.py b/alembic/operations.py index 7d59c41..18b8e69 100644 --- a/alembic/operations.py +++ b/alembic/operations.py @@ -13,9 +13,23 @@ class Operations(object): Each operation corresponds to some schema migration operation, executed against a particular :class:`.MigrationContext`. + Normally, the :class:`.MigrationContext` is created + within an ``env.py`` script via the + :meth:`.EnvironmentContext.configure` method. However, + the :class:`.Operations` object can also be used without + actually using the :class:`.EnvironmentContext` + class - only :class:`.MigrationContext`, which represents + connectivity to a single database, is needed + to use the directives. + """ def __init__(self, migration_context): - """Construct a new :class:`.Operations`""" + """Construct a new :class:`.Operations` + + :param migration_context: a :class:`.MigrationContext` + instance. + + """ self.migration_context = migration_context self.impl = migration_context.impl diff --git a/docs/build/api.rst b/docs/build/api.rst index 8541cbf..3abc955 100644 --- a/docs/build/api.rst +++ b/docs/build/api.rst @@ -5,18 +5,51 @@ API Details This section describes some key functions used within the migration process, particularly those referenced within a migration environment's ``env.py`` file. +Overview +======== + +The three main objects in use are the :class:`.EnvironmentContext`, :class:`.MigrationContext`, +and :class:`.Operations` classes, pictured below. + +.. image:: api_overview.png + +An Alembic command begins by instantiating an :class:`.EnvironmentContext` object, then +making it available via the ``alembic.context`` datamember. The ``env.py`` +script, representing a user-configurable migration environment, is then +invoked. The ``env.py`` script is then responsible for calling upon the +:meth:`.EnvironmentContext.configure`, whose job it is to create +a :class:`.MigrationContext` object. + +Before this method is called, there's not +yet any database connection or dialect-specific state set up. While +many methods on :class:`.EnvironmentContext` are usable at this stage, +those which require database access, or at least access to the kind +of database dialect in use, are not. Once the +:meth:`.EnvironmentContext.configure` method is called, the :class:`.EnvironmentContext` +is said to be *configured* with database connectivity, available via +a new :class:`.MigrationContext` object. The :class:`.MigrationContext` +is associated with the :class:`.EnvironmentContext` object +via the :attr:`.EnvironmentContext.migration_context` datamember. + +Finally, ``env.py`` calls upon the :meth:`.EnvironmentContext.run_migrations` +method. Within this method, a new :class:`.Operations` object, which +provides an API for individual database migration operations, is established +within the ``alembic.op`` datamember. The :class:`.Operations` object +uses the :class:`.MigrationContext` object ultimately as a source of +database connectivity, though in such a way that it does not care if the +:class:`.MigrationContext` is talking to a real database or just writing +out SQL to a file. + env.py Directives ================= -The :mod:`alembic.environment` module contains API features that are generally used within -``env.py`` files. +This section covers the objects that are generally used within an +``env.py`` environmental configuration script. Alembic normally generates +this script for you; it is however made available locally within the migrations +environment so that it can be customized. -The central object in use is the :class:`.EnvironmentContext` object. This object is -made present when the ``env.py`` script calls upon the :meth:`.EnvironmentContext.configure` -method for the first time. Before this function is called, there's not -yet any database connection or dialect-specific state set up, and those -functions which require this state will raise an exception when used, -until :meth:`.EnvironmentContext.configure` is called successfully. +In particular, the key method used within ``env.py`` is :meth:`.EnvironmentContext.configure`, +which establishes all the details about how the database will be accessed. .. autofunction:: sqlalchemy.engine.engine_from_config @@ -27,7 +60,6 @@ until :meth:`.EnvironmentContext.configure` is called successfully. .. automodule:: alembic.migration :members: - Commands ========= diff --git a/docs/build/api_overview.png b/docs/build/api_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad799399513c67889df3662fc27be72982a5123 GIT binary patch literal 62197 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

s3>3?iCiO><FWRAOGBPORt;w66KnGy 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 C(==89 literal 0 HcmV?d00001 diff --git a/docs/build/assets/api_overview.graffle b/docs/build/assets/api_overview.graffle new file mode 100644 index 0000000..b363d52 --- /dev/null +++ b/docs/build/assets/api_overview.graffle @@ -0,0 +1,1181 @@ + + + + + ActiveLayerIndex + 0 + AutoAdjust + + CanvasColor + + w + 1 + + CanvasOrigin + {0, 0} + CanvasScale + 1 + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2012-01-24 16:51:07 -0500 + Creator + classic + DisplayScale + 1 in = 1 in + GraphDocumentVersion + 5 + GraphicsList + + + Class + LineGraphic + Head + + ID + 2048 + + ID + 2051 + Points + + {165, 221.6} + {109, 221.6} + + Style + + stroke + + HeadArrow + StickArrow + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 33 + + + + Class + TableGroup + Graphics + + + Bounds + {{19, 207.6}, {90, 14}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 2049 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Config} + + TextPlacement + 0 + + + Bounds + {{19, 221.6}, {90, 14}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 2050 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 ConfigParser} + + TextPlacement + 0 + + + GridH + + 2049 + 2050 + + + GroupConnect + YES + ID + 2048 + + + Class + LineGraphic + Head + + ID + 2042 + + ID + 2046 + OrthogonalBarAutomatic + + OrthogonalBarPosition + 28.725006103515625 + Points + + {304, 198.756} + {385.25, 157} + + Style + + stroke + + HeadArrow + StickArrow + LineType + 2 + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 33 + + + + Class + LineGraphic + Head + + ID + 2043 + + ID + 2044 + OrthogonalBarAutomatic + + OrthogonalBarPosition + 52.850021362304688 + Points + + {433.496, 294.6} + {454.25, 177} + + Style + + stroke + + HeadArrow + StickArrow + LineType + 2 + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 38 + + + + Bounds + {{385.25, 172}, {69, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 2043 + Magnets + + {0.5, -0.142857} + + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 alembic.op} + + Wrap + NO + + + Bounds + {{385.25, 149.6}, {94, 14}} + Class + ShapedGraphic + FitText + YES + Flow + Resize + ID + 2042 + Magnets + + {0.49734, 0.0285711} + + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 alembic.context} + + Wrap + NO + + + Class + LineGraphic + Head + + ID + 2038 + + ID + 2040 + Points + + {166.088, 336.6} + {105.686, 336.6} + + Style + + stroke + + HeadArrow + StickArrow + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 41 + + + + Bounds + {{19, 294.6}, {86.1858, 84}} + Class + ShapedGraphic + ID + 2038 + Shape + Cylinder + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\fs24 \cf0 database} + + + + Bounds + {{227.597, 278.569}, {55, 12}} + Class + ShapedGraphic + FitText + YES + ID + 51 + Line + + ID + 50 + Offset + -20 + Position + 0.40689659118652344 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs20 \cf0 <<uses>>} + + + + Class + LineGraphic + Head + + ID + 41 + + ID + 50 + Points + + {234.897, 263.6} + {235.389, 315.6} + + Style + + stroke + + HeadArrow + StickArrow + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 33 + + + + Bounds + {{308.265, 310.6}, {55, 12}} + Class + ShapedGraphic + FitText + YES + ID + 49 + Line + + ID + 9 + Offset + -20 + Position + 0.5199354887008667 + RotationType + 0 + + Shape + Rectangle + Style + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs20 \cf0 <<uses>>} + + + + Class + LineGraphic + Head + + ID + 41 + + ID + 9 + Points + + {368.99, 336.6} + {305.088, 336.6} + + Style + + stroke + + HeadArrow + StickArrow + Pattern + 1 + TailArrow + 0 + + + Tail + + ID + 38 + + + + Class + TableGroup + Graphics + + + Bounds + {{166.088, 315.6}, {139, 14}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 42 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 MigrationContext} + + TextPlacement + 0 + + + Bounds + {{166.088, 329.6}, {139, 28}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 44 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 connection\ +run_migrations()} + + TextPlacement + 0 + + + GridH + + 42 + 44 + + + GroupConnect + YES + ID + 41 + + + Class + TableGroup + Graphics + + + Bounds + {{368.99, 294.6}, {139, 14}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 39 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Operations} + + TextPlacement + 0 + + + Bounds + {{368.99, 308.6}, {139, 70}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 40 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 migration_context\ +create_table()\ +alter_column()\ +add_column()\ +drop_column()} + + TextPlacement + 0 + + + GridH + + 39 + 40 + + + GroupConnect + YES + ID + 38 + + + Class + TableGroup + Graphics + + + Bounds + {{165, 179.6}, {139, 14}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 34 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 EnvironmentContext} + + TextPlacement + 0 + + + Bounds + {{165, 193.6}, {139, 70}} + Class + ShapedGraphic + FitText + Vertical + Flow + Resize + ID + 35 + Shape + Rectangle + Style + + fill + + GradientAngle + 304 + GradientCenter + {-0.294118, -0.264706} + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\fs24 \cf0 migration_context\ +configure()\ +run_migrations()\ +begin_transaction()\ +is_offline_mode()} + + TextPlacement + 0 + + + GridH + + 34 + 35 + + + GroupConnect + YES + ID + 33 + + + Bounds + {{153.176, 149.6}, {164.824, 255}} + Class + ShapedGraphic + ID + 2036 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + Fuzziness + 0.0 + + stroke + + Color + + b + 0.191506 + g + 0.389204 + r + 0.744565 + + CornerRadius + 5 + Pattern + 1 + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 env.py script} + + TextPlacement + 0 + Wrap + NO + + + Bounds + {{343.99, 259.266}, {189, 145.334}} + Class + ShapedGraphic + ID + 2032 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + Fuzziness + 0.0 + + stroke + + Color + + b + 0.191506 + g + 0.389204 + r + 0.744565 + + CornerRadius + 5 + Pattern + 1 + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 migration script} + + TextPlacement + 0 + Wrap + NO + + + Bounds + {{138.176, 127.6}, {420.824, 293.4}} + Class + ShapedGraphic + ID + 2037 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + Fuzziness + 0.0 + + stroke + + Color + + b + 0.191506 + g + 0.389204 + r + 0.744565 + + CornerRadius + 5 + Pattern + 1 + + + Text + + Align + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 alembic command} + + TextPlacement + 0 + Wrap + NO + + + GridInfo + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 1 + IsPalette + NO + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + LinksVisible + NO + MagnetsVisible + NO + MasterSheet + Master 1 + MasterSheets + + + ActiveLayerIndex + 0 + AutoAdjust + + CanvasColor + + w + 1 + + CanvasOrigin + {0, 0} + CanvasScale + 1 + ColumnAlign + 1 + ColumnSpacing + 36 + DisplayScale + 1 in = 1 in + GraphicsList + + GridInfo + + HPages + 1 + IsPalette + NO + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Orientation + 2 + OutlineStyle + Basic + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Master 1 + UniqueID + 1 + VPages + 1 + + + ModificationDate + 2012-01-24 17:14:19 -0500 + Modifier + classic + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + OutlineStyle + Basic + PageBreaks + YES + PrintInfo + + NSBottomMargin + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG + + NSLeftMargin + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG + + NSPaperSize + + size + {612, 792} + + NSRightMargin + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG + + NSTopMargin + + coded + BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG + + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + YES + SmartDistanceGuidesActive + YES + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + DrawerOpen + + DrawerTab + Outline + DrawerWidth + 209 + FitInWindow + + Frame + {{335, 186}, {760, 817}} + ShowRuler + + ShowStatusBar + + VisibleRegion + {{-84, 0}, {745, 703}} + Zoom + 1 + + + diff --git a/docs/build/ops.rst b/docs/build/ops.rst index dc2cc4b..e9d5bf0 100644 --- a/docs/build/ops.rst +++ b/docs/build/ops.rst @@ -10,22 +10,28 @@ The directives here are used within user-defined migration files, within the ``upgrade()`` and ``downgrade()`` functions, as well as any functions further invoked by those. -A key design philosophy to the :mod:`alembic.op` functions is that +All directives exist as methods on a class called :class:`.Operations`. +When migration scripts are run, this object is made available +to the script via the ``alembic.op`` datamember, which is +a *proxy* to an actual instance of :class:`.Operations`. + +A key design philosophy to the :mod:`alembic.operations` methods is that to the greatest degree possible, they internally generate the appropriate SQLAlchemy metadata, typically involving :class:`~sqlalchemy.schema.Table` and :class:`~sqlalchemy.schema.Constraint` objects. This so that migration instructions can be given in terms of just the string names and/or flags involved. The exceptions to this -rule include the :func:`.op.add_column` and :func:`.op.create_table` +rule include the :meth:`~.Operations.add_column` and :func:`~.Operations.create_table` directives, which require full :class:`~sqlalchemy.schema.Column` objects, though the table metadata is still generated here. -The functions here all require that a :class:`.Context` has been -configured within the ``env.py`` script. Under normal circumstances -this is always the case, as the migration scripts are invoked via -the :func:`.context.run_migrations` function which ultimately -is derived from the :class:`.Context` object. +The functions here all require that a :class:`.MigrationContext` has been +configured within the ``env.py`` script first, which is typically +via :meth:`.EnvironmentContext.configure`. Under normal +circumstances they are called from an actual migration script, which +itself would be invoked by the :meth:`.EnvironmentContext.run_migrations` +method. .. automodule:: alembic.operations