更改数据库模式
在开发阶段,更改数据库模式是很常见的,而且在应用程序部署之后也是可能必要的。更改数据库模式的技术以及编程方面的考虑会因访问数据库所使用的 API 不同而有所差异。
- C 和 C++ 应用程序会使用在外部文本文件中定义的静态模式,然后使用 mcocomp DDL 编译器进行编译。对于这些应用程序,根据需要修改模式文件并重新编译以生成新的静态字典。然后重新编译应用程序,并在调用
mco_db_open_dev()
时加载静态字典,或者通过调用mco_load_dictionary()
显式加载。可以通过调用 C APImco_db_save_dictionary()
或 C++ 方法saveDictionary()
将字典保存到磁盘。 - Python 应用程序在加载模式时,也会生成一个静态字典。
- Java 和 C# 应用程序则在执行期间通过解释本地类定义来创建一个动态字典。然后,可以通过调用
saveDictionary()
或SaveDictionary()
方法将此字典保存到磁盘。
在开发初期,模式变更频繁,需重复生成数据库API和应用程序。一旦应用上线,变更数据库模式需谨慎规划。为此,引入了二进制模式演进(BSE)功能。
SQL 动态数据定义语言
如果使用诸如创建表、修改表或创建索引之类的 SQL 动态 DDL 语句,静态模式会自动(且静默地)变为动态模式。
例如,可以使用 SQL 的修改表语句来更改表格式。但是,如果要从使用非 SQL API 的应用程序访问以这种方式修改的表,则必须保存包含表重新定义的动态字典(模式的二进制形式),并重新处理或重新加载,以便非 SQL 应用程序接口能够正确地与新表格式进行交互。
在启动时必须知道是使用静态模式还是动态模式。
- 如果在配置文件中使用了静态模式,当用户发出 SQL 动态 DDL 语句后,此配置文件将自动失效,必须移除模式部分。
- 如果在已更改模式的现有动态模式数据库上以静态模式启动,将发出错误 MCO_E_SCHEMA_CHANGED。
另外,如果调用 savemeta
命令,它将不会反映实际的数据库模式。
请注意强烈不建议,在同一应用程序的上下文中混合使用静态和动态字典。
保存数据库字典
为了将数据库字典保存到文本模式文件中,提供了以下 API:
使用xSQL
在 xSQL 中,使用 savedict
命令:
savedict <file-path>
嵌入式及SQL
从嵌入式SmartEDB或SmartESQL应用程序中,使用以下部分中描述的API之一。
C API:调用
mco_db_save_dictionary()
MCO_RET mco_db_save_dictionary( void* stream_handle, mco_stream_write output_stream_writer, mco_db_h db );
C++ API:调用
saveDictionary()
方法:void McoSqlEngine::saveDictionary( char const *filePath ); void McoSqlEngine::saveDictionary( void *stream, mco_stream_write streamWriter );
Java:调用 Connection 类的
saveDictionary()
方法:public boolean Connection.saveDictionary(String filePath);
C#:调用 Connection 类的
saveDictionary()
方法:public void Connection.SaveDictionary(String filePath);
Python:调用 Connection 类的
saveDictionary()
方法:Connection.saveDictionary(string file path);
C 和 C++ 应用程序必须使用 DDL 模式编译器 mcocomp 处理新的模式文件,该编译器会生成新的访问接口;生成的**.h** 和**.c** 文件会被编译进 C 或 C++ 应用程序。然后新的可执行文件就能正确访问修改后的表。
Java、C# 和 Python 应用程序必须从保存的文件重新加载数据库模式,或者必须进行修改以反映模式的新版本。