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 716de62f..d562add6 100644 --- a/alembic/environment.py +++ b/alembic/environment.py @@ -5,7 +5,15 @@ from alembic import util 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 @@ class EnvironmentContext(object): 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 @@ class EnvironmentContext(object): 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 7d59c41c..18b8e692 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 8541cbf7..3abc9556 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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

ZThquU259LWIhH3q6j*8Br8}|i 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 f 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 b$TtD+!xO``Pccc5uSZHuUbI@+An5-C;L|i# literal 0 Hc-jL100001 diff --git a/docs/build/assets/api_overview.graffle b/docs/build/assets/api_overview.graffle new file mode 100644 index 00000000..b363d526 --- /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 dc2cc4bf..e9d5bf0c 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 -- 2.47.2