精华内容
下载资源
问答
  • 遇到一个需求,需要修改数据库中所有包含email字段的表,要把里面长度改为128位。Laravel获取所有的表,然后循环判断里面有没有email这个字段。 代码如下: use Illuminate\Support\Facades\Schema; use DB; ...
  • 更改数据库的方法数据库添加一张或多张新 删除一张或多张表 为旧添加一个字段 为旧更新一个字段 为旧初始化一条新的记录 最后前言SQLAlchemy 的使用方法和相关基础内容也写过不少了, 有兴趣的小伙伴可以...

    目录

    前言

    SQLAlchemy 的使用方法和相关基础内容也写过不少了, 有兴趣的小伙伴可以翻阅以往的博文, 本篇主要记录一下 SQLAlchemy 在 Openstack 中的使用规范.

    更改数据库的方法

    在开发 Openstack 项目的过程中, 对 models class 进行直接修改是不被允许的. 这不符合持续集成的规范, 也可能导致原始数据的丢失. 所以我们会使用一种类似打补丁的方式来对 Openstack 项目的数据库进行持续更新, 这也就是为什么在 /opt/stack/nova/nova/db/sqlalchemy/migrate_repo/versions 路径下存在这么多文件的原因.

    为数据库添加一张或多张新表

    当需要为 Openstack 项目新添一张表时, 我们会 /opt/stack/nova/nova/db/sqlalchemy/migrate_repo/versions 目录下新建一个文件, 并且需要为文件名指定一个有序的编号, EG. 016_add_new_table.py

    from sqlalchemy import Boolean, Column, DateTime, BigInteger
    from sqlalchemy import MetaData, String, Table
    
    from oslo_log import log as logging
    
    
    LOG = logging.getLogger(__name__)
    
    
    def define_tables(meta):
        # 定义一个 Table 对象
        new_table_name = Table(
            "new_table_name", meta,
            Column("created_at", DateTime),
            Column("updated_at", DateTime),
            Column("deleted_at", DateTime),
            Column("deleted", Boolean),
            mysql_engine="InnoDB")
        ...
    
        return [new_table_name, ...]
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # create all tables
        # Take care on create order for those with FK dependencies
        tables = define_tables(meta)
    
        # 循环创建表列表
        for table in tables:
            try:
                table.create()
            except Exception:
                LOG.info(_LE('Exception while creating table.'))
                raise
    
    
    def downgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
        tables = define_tables(meta)
        tables.reverse()
        for table in tables:
            table.drop()

    删除一张或多张表

    from sqlalchemy import MetaData
    from sqlalchemy import Table
    
    
    def upgrade(migrate_engine):
        meta = MetaData(migrate_engine)
        meta.reflect(migrate_engine)
    
        table_names = ['compute_node_stats', 'compute_nodes', 'instance_actions',
                       'instance_actions_events', 'instance_faults', 'migrations']
        for table_name in table_names:
            # 创建表对象, 然后在通过表对象来调用 drop() 方法实现删除.
            table = Table('dump_' + table_name, meta)
            table.drop(checkfirst=True)
    

    为旧表添加一个字段

    from sqlalchemy import Column, MetaData, String, Table
    
    
    NEW_COLUMN_NAME = 'initiator_name'
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # 定义一个表对象, 因为是更新操作, 所以表 exsi_hypervisors 需要已经存在于数据库中
        exsi_hypervisors = Table('exsi_hypervisors', meta, autoload=True)
        # 定义一个字段对象
        initiator_protocol = Column(NEW_COLUMN_NAME, String(length=255))
        # 如果表中还没有该字段, 则添加一个新的字段
        if not hasattr(exsi_hypervisors.c, NEW_COLUMN_NAME):
            # 表对象调用 create_column() 方法来将字段插入
            exsi_hypervisors.create_column(initiator_protocol)
    
    

    为旧表更新一个字段

    from sqlalchemy import Column, MetaData, String, Table
    
    NEW_COLUMN_NAME = 'initiator_name'
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # 获取一个表对象
        exsi_hypervisors = Table('exsi_hypervisors', meta, autoload=True)
    
        # 如果表对象中已经存在了 metadata_reserve 属性(字段), 则 alter 该属性(字段)
        if hasattr(exsi_hypervisors.c, 'metadata_reserve'):
            # 获取 metadata_reserve 属性对象
            exsi_hypervisors_metadate_reserve = getattr(exsi_hypervisors.c,
                                                        'metadata_reserve')
            # 通过属性对象来调用 alter() 方法, 并且传入需要更新的字段名和类型作为实参
            exsi_hypervisors_metadate_reserve.alter(name='initiator_protocol',
                                                    type=String(255))

    为旧表初始化一条新的记录

    from datetime import datetime
    from uuid import uuid4
    
    from sqlalchemy import MetaData, Table
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # 定义要插入的记录数据
        values = [{'created_at': datetime.utcnow(),
                   'id': str(uuid4()),
                   'group': 'global',
                   'setting_option': 'cpu_over_allocate',
                   'setting_value': '6',
                   'description': 'Over allocate CPU'}]
    
        # 创建一个 table 对象, 该表必须是已经存在于数据库内的表, 才能够被插入
        system_settings = Table('system_settings', meta,
                                autoload=True)
        # 通过表对象来调用 insert() 方法实现插入数据                      
        for value in values:
            system_settings.insert().values(value).execute()
    
    def downgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        system_settings = Table('system_settings', meta,
                                autoload=True)
        try:
            system_settings.delete().\
                where(system_settings.c.setting_option == 'cpu_over_allocate').\
                execute()
    
        except Exception as e:
            raise e

    最后

    在实现了数据库修改的文件之后执行指令:

    serviceName-manager db dync

    就能够对现有的数据库进行更新.

    以这种补丁的方式来修改 Openstack 项目的数据库, 能够更好的支持持续的集成, 和降低数据丢失的风险, 尽管这些数据是测试数据也存在这价值. 所以我们一本很少对数据库进行删除操作, 如若必须删除数据库中的数据库一定要谨慎.

    展开全文
  • 修改数据库表结构时提示【不允许保存更改。您所做更改要求删除并重新创建以下表。您对无法重新创建标进行了更改或者启用了“阻止保存要求重新创建表更改"选项。】 工具/原料 ...

    修改数据库表结构时提示【不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改"选项。】

    不允许保存更改,阻止保存要求重新创建表的更改

    工具/原料

    • 数据库

    方法/步骤

    1. 1

      登录sql2008,找到数据库【news】展开表文件夹

      不允许保存更改,阻止保存要求重新创建表的更改
    2. 2

      在表上单击右键,选择【设计】

      不允许保存更改,阻止保存要求重新创建表的更改
    3. 3

      修改了数据库的表名和列名,点击【保存】之后弹出消息框,不能保存修改

      不允许保存更改,阻止保存要求重新创建表的更改
      END

    处理方法

    1. 点击SQL2008菜单【工具】【选项】

      不允许保存更改,阻止保存要求重新创建表的更改
    2. 打开了选项对话框,我们展开DESIGNERS

      不允许保存更改,阻止保存要求重新创建表的更改
    3. 取消【阻止保存要求重新创建表的更改】复选框

      不允许保存更改,阻止保存要求重新创建表的更改
    4. 再次修改表news的数据类型

      不允许保存更改,阻止保存要求重新创建表的更改
    5. 点击保存

      不允许保存更改,阻止保存要求重新创建表的更改
    6. 弹出警告窗口,我们点击【是】就可以更改了

      不允许保存更改,阻止保存要求重新创建表的更改

    展开全文
  • 更改数据库的方法数据库添加一张或多张新删除一张或多张表为旧添加一个字段为旧更新一个字段为旧初始化一条新的记录最后 更改数据库的方法 在开发 Openstack 项目的过程中, 对 models class 进行...

    更改数据库的方法

    在开发 Openstack 项目的过程中, 对 models class 进行直接修改是不被允许的

    这不符合持续集成的规范, 也可能导致原始数据的丢失. 所以我们会使用一种类似

    打补丁的方式来对 Openstack 项目的数据库进行持续更新, 这也就是为什么在

     /opt/stack/nova/nova/db/sqlalchemy/migrate_repo/versions 路径下存在这么多文

    件的原因.

    为数据库添加一张或多张新表

    当需要为 Openstack 项目新添一张表时, 我们会在 

    /opt/stack/nova/nova/db/sqlalchemy/migrate_repo/versions 

    目录下新建一个文件, 并且需要为文件名指定一个有序的编号, 

    EG. 016_add_new_table.py

    from sqlalchemy import Boolean, Column, DateTime, BigInteger
    from sqlalchemy import MetaData, String, Table
    
    from oslo_log import log as logging
    
    
    LOG = logging.getLogger(__name__)
    
    
    def define_tables(meta):
        # 定义一个 Table 对象
        new_table_name = Table(
            "new_table_name", meta,
            Column("created_at", DateTime),
            Column("updated_at", DateTime),
            Column("deleted_at", DateTime),
            Column("deleted", Boolean),
            mysql_engine="InnoDB")
        ...
    
        return [new_table_name, ...]
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # create all tables
        # Take care on create order for those with FK dependencies
        tables = define_tables(meta)
    
        # 循环创建表列表
        for table in tables:
            try:
                table.create()
            except Exception:
                LOG.info(_LE('Exception while creating table.'))
                raise
    
    
    def downgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
        tables = define_tables(meta)
        tables.reverse()
        for table in tables:
            table.drop()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    删除一张或多张表

    from sqlalchemy import MetaData
    from sqlalchemy import Table
    
    
    def upgrade(migrate_engine):
        meta = MetaData(migrate_engine)
        meta.reflect(migrate_engine)
    
        table_names = ['compute_node_stats', 'compute_nodes', 'instance_actions',
                       'instance_actions_events', 'instance_faults', 'migrations']
        for table_name in table_names:
            # 创建表对象, 然后在通过表对象来调用 drop() 方法实现删除.
            table = Table('dump_' + table_name, meta)
            table.drop(checkfirst=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    为旧表添加一个字段

    from sqlalchemy import Column, MetaData, String, Table
    
    
    NEW_COLUMN_NAME = 'initiator_name'
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # 定义一个表对象, 因为是更新操作, 所以表 exsi_hypervisors 需要已经存在于数据库中
        exsi_hypervisors = Table('exsi_hypervisors', meta, autoload=True)
        # 定义一个字段对象
        initiator_protocol = Column(NEW_COLUMN_NAME, String(length=255))
        # 如果表中还没有该字段, 则添加一个新的字段
        if not hasattr(exsi_hypervisors.c, NEW_COLUMN_NAME):
            # 表对象调用 create_column() 方法来将字段插入
            exsi_hypervisors.create_column(initiator_protocol)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    为旧表更新一个字段

    from sqlalchemy import Column, MetaData, String, Table
    
    NEW_COLUMN_NAME = 'initiator_name'
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # 获取一个表对象
        exsi_hypervisors = Table('exsi_hypervisors', meta, autoload=True)
    
        # 如果表对象中已经存在了 metadata_reserve 属性(字段), 则 alter 该属性(字段)
        if hasattr(exsi_hypervisors.c, 'metadata_reserve'):
            # 获取 metadata_reserve 属性对象
            exsi_hypervisors_metadate_reserve = getattr(exsi_hypervisors.c,
                                                        'metadata_reserve')
            # 通过属性对象来调用 alter() 方法, 并且传入需要更新的字段名和类型作为实参
            exsi_hypervisors_metadate_reserve.alter(name='initiator_protocol',
                                                    type=String(255))
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    为旧表初始化一条新的记录

    from datetime import datetime
    from uuid import uuid4
    
    from sqlalchemy import MetaData, Table
    
    
    def upgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        # 定义要插入的记录数据
        values = [{'created_at': datetime.utcnow(),
                   'id': str(uuid4()),
                   'group': 'global',
                   'setting_option': 'cpu_over_allocate',
                   'setting_value': '6',
                   'description': 'Over allocate CPU'}]
    
        # 创建一个 table 对象, 该表必须是已经存在于数据库内的表, 才能够被插入
        system_settings = Table('system_settings', meta,
                                autoload=True)
        # 通过表对象来调用 insert() 方法实现插入数据                      
        for value in values:
            system_settings.insert().values(value).execute()
    
    def downgrade(migrate_engine):
        meta = MetaData()
        meta.bind = migrate_engine
    
        system_settings = Table('system_settings', meta,
                                autoload=True)
        try:
            system_settings.delete().\
                where(system_settings.c.setting_option == 'cpu_over_allocate').\
                execute()
    
        except Exception as e:
            raise e
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    最后

    在实现了数据库修改的文件之后执行指令:

    serviceName-manager db dync
    • 1
    • 1

    就能够对现有的数据库进行更新.

    展开全文
  • 在实际开发应用中,经常会遇到修改数据库表结构的情况。用PowerBuilder修改数据库表结构与用Foxbase修改数据库结构不同。在PowerBuilder中,除可以在数据库表结构中添加字段名外,无法直接修改数据库表结构,如删除...

    PowerBuilder是目前公认的、最佳的数据库前端开发工具之一。在实际开发应用中,经常会遇到修改数据库表结构的情况。用PowerBuilder修改数据库表结构与用Foxbase修改数据库结构不同。在PowerBuilder中,除可以在数据库表结构中添加字段名外,无法直接修改数据库表结构,如删除某个字段名或类型或字段名长度等,都会导致数据库表记录的丢失。我们通过实践探索,总结了几种方法仅供大家

    参考,请大家批评指正。

    一、修改数据库表结构,数据库表中没有记录

    方法1:将表结构以ExportTable文件格式输出。

    Database中选择要修改的数据库表Table

    Objects中选择ExportTableViewSyntaxtoLog,取名保存即选SaveLogAs,以*.sql格式保存。

    Objects中选择DatabaseAdministration

    File中选择DosOpen,选文件名Filename*.sql,打开进行修改。

    Objects中选择Execute SQL。即产生一新的数据库表结构。

    注意:Table名不要同名。

    方法2:将表结构以SQLSyntax文件格式输出。

    Database中选择要修改的数据库表Table

    Preview键。

    File中选择SaveRowsasFileFormatSQLSyntax,取表名*.sql保存。

    File中选择DosOpen,打开表名*.sql,进行修改。

    取表名后,Execute SQL

    注意:此种方法没有生成PrimaryKey

    二、修改数据库表结构,保存原数据库表中记录

    方法1:先修改数据库表结构,用SQL语句转移数据库表中记录

    将表1生成表1.sql,修改结构,将表1另取名为表2

    运行表2.sql,生成表2。此时产生一新的数据库表结构。

    Objects中选择DatabaseAdministration,写SQLStatementInsert into新表名 

    select* from旧表名;Execute SQL。将旧表中所有字段内容转入新表中。

    删除表1,从File中选择DosOpen,打开文件名Filename即表2.sql,将表2统一改为表1。运行表1.sql

    ,生成新结构的表1,此时无记录。

    按步骤3,将表2中的记录全部转入表1中。
      

    若将部分字段转入,写SQLStatement
      
    insertinto
    新表名(字段1,字段2......)
      

    select
    字段1,字段2......from旧表名;

    Execute SQL。旧表中部分字段内容转入新表中。

    方法2:将表结构和记录以SQLSyntax文件格式输出。


    Database中选择要修改的数据库表Table,按Preview键。

    File中选择SaveRowsasFile FormatSQLSyntax,取表名*.sql保存。

    File中选择DosOpen,打开表名*.sql,进行修改。

    取表名后,Execute SQL

    方法3:将表结构和记录以TXT文件格式输出。
    Database中打开数据库表,按Preview键。

    File中选择SaveRowsasFile FormatTXT,取表名*.txt保存。

    将表生成表.sql,修改结构,运行表.sql,此时产生一新的数据库表结构。

    Database中打开数据库表,按Preview键。

    Rows中选择Import,选*.txt

    File中选择SavechangestoDatabase

    展开全文
  • 在oracle10g数据库修改表的结构 以下以已经创建表(hencent)为例叙述: create table hencent(id number(10),name varchar(10),addr varc...
  • Django修改数据库表结构

    千次阅读 2018-04-20 15:05:53
    Django在数据库中创建数据库表的方法是:1, 执行 python manage.py makemigrations 这一步在项目中建立migrations目录,在目录中建立了0001_initial.py文件,这个文件中包含了所有在数据库表中建立的信息。...
  • 在现有数据上对表增减一些... 处理方法就是:选择菜单 工具-〉选项-〉左侧有个 设计器-〉设计器和数据库设计器。然后去掉“ 阻止保存要求重新创建表的更改”前面勾。重新启动MSSQL SERVER 2008即可。如截图。
  • PowerBuilder修改数据库表结构的技巧

    千次阅读 2002-05-13 09:30:00
    在实际开发应用中,经常会遇到修改数据库表结构的情况。用PowerBuilder修改数据库表结构与用Foxbase修改数据库结构不同。在PowerBuilder中,除可以在数据库表结构中添加字段名外,无法直接修改数据库表结构,如删除...
  • 修改数据库表结构时不允许保存更改问题 数据库 方法/步骤 1 登录sql2008,找到数据库【news】展开表文件夹 不允许保存更改,阻止保存要求重新创建表更改 2 在表上单击右键,选择【设计】 不允许保存更改,阻止保存...
  • 修改表结构是个危险操作,默认情况下,当你修改表结构时,会弹出如下提示框 上图是修改DeUser表中列数据类型(从varchar修改为int),然后保存时弹出提示框。如果我们不想重新创建这张表,只是想在原有基础...
  • 问题就是当设计好表结构之后,后期如果需要往表中增加字段,默认会把该字段放到表最后,并且字段特别多而我们又想把有关联性字段放在一起,这时就要修改字段顺序。在修改顺序之前,我们先来看看Oracle数据库表中...
  • 修改表结构2.1修改表名:2.2添加字段2.3删除字段2.4修改字段:2.5添加/删除默认值、主键、唯一:2.6修改表存储引擎:2.7设置自增长值2.8删除数据表2.9一些补充 2.修改表结构 2.1修改表名: ALTER TABLE tbl_name ...
  • 数据库导出表结构到Excel 使用方法 下载该工程到本地,本工程为springboot工程,修改application.yml配置文件,把数据库地址改成要打印地址,直接运行项目即可. 访问http://localhost:9081/,出现操作界面,如下 ...
  • sql语言修改表结构的一些方法

    千次阅读 2014-03-19 14:36:32
    这次的教材里面介绍了如何用sql语句创建一个数据库和相应的表结构,也说明了表结构的细节设计如约束等,但是没有说明如果创建了一个表结构后修改这个结构,是重新创建还是可以直接修改,学员经常会提出这些问题,...
  • 为克服现有方法存在的不足,在Visual Studio 2010环境下,基于C#编程语言,开发了一个针对SQL Server数据库表结构的报表生成系统。该系统支持单表导出和批量导出两种工作模式,支持将表结构导出到Word和Excel两种...
  • 在sqlserver数据库同步过程中,是无法修改发布服务器的表结构方法如下: 其实,很简单,只需要找到发布,然后右键,选择“属性”: 在弹出框中,在左边选择“项目”,在右边去掉“仅显示列表中已选中...
  • 知识点:使用SQL语句创建完整版数据库、使用SQL语句创建数据库表创建好以后新增加字段、修改字段、删除字段的方法。删除数据库表数据库的方法。 需要掌握的知识: SQL Server数据库第一课:常用数据库介绍、...
  • 引言  一般在操作数据库的过程中对表修改操作常常涉及, ... 因此, 修改表结构, 看似简单实则处处细节 修改表结构  修改表结构大致有如下基本语法 1 -- 1. 修改表名 2 ALTER TABLE 表名 3 RENAME ...
  • 数据库的表结构生成Execl表格一个小工具,写文档时很好用哦 操作方法: 1.打开此文件,出现对话框后点击“启用宏” 2.出现对话框后点击数据库连接,修改相关参数 ;Password=sa User ID=sa Initial Catalog=kjgl_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,885
精华内容 754
关键字:

数据库修改表结构的方法