【发布时间】:2020-03-10 17:18:20
【问题描述】:
我开发了一些 Python 脚本,它们使用 PyMySQL 库将数据插入 MariaDB 数据库。
直到昨天,脚本都运行良好。昨天服务器的硬盘坏了。我刚刚安装了 3 个磁盘(1 个用于引导和 SWAP,另外两个在带有 EXT4 和 / 安装点的 raid 1 中)。当主包准备好后,我发现脚本由于下一个查询而无法正常工作
INSERT
INTO
devices(
source_id,
serialnumber,
NAME,
location_desc
)
SELECT
2,
'5996B',
'Barbate',
'CADIZ'
WHERE NOT EXISTS
(
SELECT
1
FROM
devices
WHERE
serialnumber = '5996B'
)
如果设备不存在,此查询将设备插入到设备表中。这些脚本在我的本地 MariaDB 服务器中运行良好,但在生产服务器中运行良好,出现下一个错误:
Error
SQL query: Documentation
INSERT
INTO
devices(
source_id,
serialnumber,
NAME,
location_desc
)
SELECT
2,
'5996B',
'Barbate',
'CADIZ'
WHERE NOT EXISTS
(
SELECT
1
FROM
devices
WHERE
serialnumber = '5996B'
)
MariaDB said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE NOT EXISTS
(
SELECT
1
FROM
devices
W' at line 14
我认为这是与较新版本的 MariaDB 的兼容性问题。如何在不重写 Python 脚本的情况下修复它?
编辑:
结果:
SELECT VERSION();
本地服务器中的响应(SQL 语句工作的地方):
10.4.6-MariaDB
生产服务器中的响应(SQL 语句不起作用):
10.3.17-MariaDB-0+deb10u1
【问题讨论】:
-
你的
FROM呢???SELECT WHERE NOT EXIST()。SELECT来自哪里? -
@Eric 该查询在开发 mysql 服务器中有效
-
此语句中没有任何内容会导致向后兼容性问题。所以也许你的 python 脚本没有正确构建它。
-
是的。您需要检查 python ..(顺便说一句,将东西推广到不同于开发/测试/登台的生产环境不是一个好主意,或者冒着这种事情咬你的风险)。
-
我编辑了你的标签和问题。您使用的不是 MySQL,而是 MariaDB。 MariaDB 在 2010 年从 MySQL 分叉出来,并且逐渐变得越来越不兼容。你不应该再认为 MariaDB 与 MySQL 兼容。