首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果架构未更改,则跳过metadata.drop_all metadata.create_all

如果架构未更改,则跳过metadata.drop_all metadata.create_all
EN

Stack Overflow用户
提问于 2013-10-27 23:26:07
回答 1查看 259关注 0票数 0

如果drop_all;create_all不让我更改模式,我会跳过这两行。

我怎样才能做到这一点呢?

背景:我使用SQLite来缓存和保存代码更改时的数据并不值得这么做,但是如果缓存了内容,同时没有发生代码或数据库更改,我希望保留缓存的数据并直接使用它。

注意:现在这个问题引起了学术上的兴趣,因为我的团队接受了“开发人员必须关心迁移”的解决方案。我仍然感兴趣的是如何检测实际的db-schema是否与实体派生的db-schema匹配。

EN

回答 1

Stack Overflow用户

发布于 2013-11-03 05:54:54

在数据库中创建一个版本表,用于存储模式的版本号,然后根据应用程序中的编号检查该版本号。

这与alembic等模式迁移工具使用的方法相同。使用真正的迁移工具并只调用"upgrade“而不是"create_all()”将是这里的最佳实践。

比较模式并不是一项简单的任务-- alembic实际上包括了一个提供模式的功能,你也可以在API级别访问它,但它有很多警告,对于生成新的迁移脚本来说,它更像是一种节省时间的方法。

编辑:Alembic的接口:compare_metadata

示例:

代码语言:javascript
复制
from alembic.migration import MigrationContext
from alembic.autogenerate import compare_metadata
from sqlalchemy.schema import SchemaItem
from sqlalchemy.types import TypeEngine
from sqlalchemy import (create_engine, MetaData, Column,
        Integer, String, Table)
import pprint

engine = create_engine("sqlite://")

engine.execute('''
    create table foo (
        id integer not null primary key,
        old_data varchar,
        x integer
    )''')

engine.execute('''
    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)

输出:

代码语言:javascript
复制
[ ( 'add_table',
    Table('bat', MetaData(bind=None),
        Column('info', String(), table=<bat>), schema=None)),
  ( 'remove_table',
    Table(u'bar', MetaData(bind=None),
        Column(u'data', VARCHAR(), table=<bar>), schema=None)),
  ( 'add_column',
    None,
    'foo',
    Column('data', Integer(), table=<foo>)),
  ( 'remove_column',
    None,
    'foo',
    Column(u'old_data', VARCHAR(), table=None)),
  [ ( 'modify_nullable',
      None,
      'foo',
      u'x',
      { 'existing_server_default': None,
        'existing_type': INTEGER()},
      True,
      False)]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19619738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档