【发布时间】:2017-07-30 12:06:35
【问题描述】:
我想使用 PHP 脚本将大约 10 个表从 Postgres 迁移到 Sybase。
到目前为止,我完成了删除脚本,它只是清空了目标数据库上所有需要的表。
到目前为止,迁移脚本能够连接到两个数据库并打印出内容。除此之外,在后面的 INSERT 之后,我正在计算用于检查目标表是否与源表匹配的行数(我最近了解到参数 @@ERROR 可以正确检查 SQL 是否成功,并将对其进行调整)。
我现在的问题是我收到一条错误消息:
警告:sybase_query():Sybase:服务器消息: '1' 附近的语法不正确。 (严重性 15,程序 N/A)在 .../.../...
尝试将 Postgres 数据库中的选定行插入 Sybase 数据库时。 因此我使用了 fetch_assoc 方法来读取每一行的数据。这个方法的问题,它会返回一个字符串而不是一个整数,如下所示:http://php.net/manual/de/function.pg-fetch-assoc.php
我的代码中的具体点如下所示:
while ($row = pg_fetch_assoc($result)) {
$insert_dst = $destDB->query("SET IDENTITY_INSERT " . $dst_sy_tbl . " ON INSERT INTO " . $dst_sy_tbl . " (Integerfield, SOME_TEXT1, SOME_TEXT2) VALUES(". $row['integerfield'] . " '" . $row['some_text1'] . "', '" . $row['sometext2'] . "')" );
}
源表整数格式为 int4,目标表整数格式为 numeric(8,0)。上述方法现在尝试将字符串插入到“integerfield”列中,该列需要格式化为 numeric(8,0) 的整数。
PHP 中是否有更好的方法来接收来自 Postgres 的数据,以便它们“按原样”存储,而无需先格式化为字符串,然后再将字符串转换回整数?强>
注意:我还尝试使用简单的 SQL 来获得想要的结果,如下所示:Insert into ... values ( SELECT ... FROM ... )
但在我的数据库工具上执行此操作时,它缺乏访问 SRC_Table 的权限,因为它位于不同的数据库中。 - 也许在 php-script 中这会起作用,因为两个连接都已经建立并且我能够打印两个表的内容。
SET IDENTITY_INSERT DST_Table ON INSERT INTO db_name.of.DST_Table(Integer, SOME_TEXT1, SOME_TEXT2) SELECT integer, some_text1, some_text2 FROM db_name.of.SRC_Table;
【问题讨论】:
-
我完全误解了 ERROR 消息,并认为如果结果集中的每一行都作为字符串给出是不好的。最后,我放置了一个 SQL-insert 命令,它无论如何都是由字符串组成的。我的错误是,我将整数作为 '1' 而不是 1 。另一个错误是错误的比较方法,我将 GO 方向 Sybase 盲复制到 Postgres Script,对于 RETURN 方向 Postgres 到 Sybase 我不得不将“string”调整为“varchar”,将“datetime”调整为“timestamp”
标签: php sql postgresql database-migration sap-ase