#Dg d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z d d lm
Z
d d
lmZ d dlmZ d dl
mZ d
dlmZ d
dlmZ ddlmZ ddlmZ erZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ ddlmZ ddlmZ ddlm Z ddlm!Z! ddl"m#Z# ddl"m$Z$ ddl"m%Z% ddl&m'Z' dd l(m)Z) dd!l(m*Z* dGd(Z+dHd*Z, dIdJd>Z-dKdBZ. G dC dD Z/ G dE dF Z0dS )L )annotationsN)Any)Callable)Dict)Iterator)Optional)Sequence)Set)
TYPE_CHECKING)Union)inspect )compare)render )util)ops)
Connection)Dialect) Inspector)MetaData)
SchemaItem)Config)DowngradeOps)MigrationScript)
UpgradeOps)NameFilterParentNames)NameFilterType)RenderItemFnMigrationContext)Script)ScriptDirectorycontextr! metadatar returnr c T t | | }|j S )aB
Compare a database schema to that given in a
:class:`~sqlalchemy.schema.MetaData` instance.
The database connection is presented in the context
of a :class:`.MigrationContext` object, which
provides database connectivity as well as optional
comparison functions to use for datatypes and
server defaults - see the "autogenerate" arguments
at :meth:`.EnvironmentContext.configure`
for details on these.
The return format is a list of "diff" directives,
each representing individual differences::
from alembic.migration import MigrationContext
from alembic.autogenerate import compare_metadata
from sqlalchemy import (
create_engine,
MetaData,
Column,
Integer,
String,
Table,
text,
)
import pprint
engine = create_engine("sqlite://")
with engine.begin() as conn:
conn.execute(
text(
'''
create table foo (
id integer not null primary key,
old_data varchar,
x integer
)
'''
)
)
conn.execute(text("create table bar (data varchar)"))
metadata = MetaData()
Table(
"foo",
metadata,
Column("id", Integer, primary_key=True),
Column("data", Integer),
Column("x", Integer, nullable=False),
)
Table("bat", metadata, Column("info", String))
mc = MigrationContext.configure(engine.connect())
diff = compare_metadata(mc, metadata)
pprint.pprint(diff, indent=2, width=20)
Output::
[
(
"add_table",
Table(
"bat",
MetaData(),
Column("info", String(), table=