我正在尝试将我的PostgreSQL数据库中的所有数据移动到MySQL数据库,因此我使用的是MySQL Workbench>数据迁移工具。
在“逆向工程师来源”步骤中,我收到了一个奇怪的错误:
ERROR: Reverse engineer selected schemata: ProgrammingError("('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)')"): error calling Python module function DbPostgresqlRE.reverseEngineer Failed
此错误消息显示在其末尾的完整错误日志是:
Starting...
Connect to source DBMS...
- Connecting...
Connecting to ...
Opening ODBC connection to DSN=InventoryDBDS...
Connected
Connect to source DBMS done
Reverse engineer selected schemata....
Reverse engineering public from InventoryDB
- Reverse engineering catalog information
Traceback (most recent call last):
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_postgresql_re_grt.py", line 335, in reverseEngineer
return PostgresqlReverseEngineering.reverseEngineer(connection, catalog_name, schemata_list, context)
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_generic_re_grt.py", line 228, in reverseEngineer
catalog = cls.reverseEngineerCatalog(connection, catalog_name)
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_generic_re_grt.py", line 388, in reverseEngineerCatalog
cls.reverseEngineerSequences(connection, schema)
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_postgresql_re_grt.py", line 76, in reverseEngineerSequences
min_value, max_value, start_value, increment_by, last_value, is_cycled, ncache = cls.execute_query(connection, seq_details_query % (schema.name, seq_name)).fetchone()
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_generic_re_grt.py", line 76, in execute_query
return cls.get_connection(connection_object).cursor().execute(query, *args, **kwargs)
pyodbc.ProgrammingError: ('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)')
Traceback (most recent call last):
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\workbench\wizard_progress_page_widget.py", line 192, in thread_work
self.func()
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\migration_schema_selection.py", line 160, in task_reveng
self.main.plan.migrationSource.reverseEngineer()
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\migration.py", line 335, in reverseEngineer
self.state.sourceCatalog = self._rev_eng_module.reverseEngineer(self.connection, self.selectedCatalogName, self.selectedSchemataNames, self.state.applicationData) SystemError: ProgrammingError("('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)')"): error calling
Python module function DbPostgresqlRE.reverseEngineer
ERROR: Reverse engineer selected schemata: ProgrammingError("('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)')"): error calling Python module function DbPostgresqlRE.reverseEngineer Failed
我在网上搜索了与日志中出现的相关的错误(错误42P01),但找不到任何引用。所以,如果有人可以请告诉我,我在这里做错了什么,这真的很棒。
由于
答案 0 :(得分:2)
这个错误让我来到这里。
如果你的" psqlcfg_lid_seq"实际上包括大写和小写字符,请记住,PostgreSQL会将名称转换为ALL小写进行查询。
基本知识是:为了执行大小写匹配的查询,名称必须用双引号括起来("),这样就可以避免转换。
然而,在MySQL Workbench中,他们在尝试获取序列时忘记这样做。
在 db_postgresql_re_grt.py 中。位于Windows上的%Program Files%\ MySQL \ MySQL Workbench(您的版本,例如" 6.1 CE")\ modules。
在70左右,您将在变量 seq_details_query 中找到SQL查询,它将类似于:
seq_details_query = """SELECT min_value, max_value, start_value,
increment_by, last_value, is_cycled, cache_value
FROM %s.%s"""
将其更改为:
seq_details_query = """SELECT min_value, max_value, start_value,
increment_by, last_value, is_cycled, cache_value
FROM \"%s\".\"%s\""""
因此可以获取序列,因此可以进行整个流程。
请注意:您可能需要重新启动MySQL Workbench才能使用修改过的脚本。
我很惊讶MySQL家伙仍然没有解决这个问题。也许我需要以某种方式报告错误? :P
答案 1 :(得分:1)
42P01
是一般错误,意味着该对象不存在。
在这种情况下,它是不存在的序列public.psqlcfg_lid_seq
。
根据一系列错误消息,当工具尝试查询该序列的属性时会发生错误(使用SELECT ... FROM schema_name.sequence_name
)
据推测,即使不再存在,该序列仍会在数据库中的某处引用。从理论上讲,PostgreSQL中存在针对这种情况的保护措施(依赖性跟踪),但我认为它们依赖于您的服务器版本,可能依赖于依赖项的具体细节。
要查找对此序列的引用,一种方法是将数据库架构转储到SQL文本文件(使用pg_dump -s
)并在其中搜索文本psqlcfg_lid_seq
。
一旦找到,大概有些ALTER
语句可能会删除引用。