我正在编辑和扩展由第三部分构建的ansible剧本。
我添加了一个在DB上运行查询并将数据转储到csv文件中的任务:
- name: run query1 and dump data in csv
community.postgresql.postgresql_copy:
login_host: '{{ db_host }}'
login_user: '{{ db_username }}'
login_password: '{{ db_password }}'
db: '{{ db_database }}'
port: '{{ db_database_port }}'
src: "{{ lookup('template', 'query1.sql.j2') }}"
copy_to: "{{ log_base_path }}/results1.csv"
options:
format: csv
delimiter: ';'
header: yes
query1.sql.j2
的含量为
SELECT
KEY,
idint,
barcode,
systemLV1,
systemLV2,
n.attribute1 AS attribute1_master,
c.attribute1 AS attribute1_systemLV2,
n.attribute2 AS attribute2_master,
c.attribute2 AS attribute2_systemLV2,
n.attribute3 AS attribute3_master,
c.attribute3 AS attribute3_systemLV2,
n.attribute1 = c.attribute1 AS check_attribute1_systemLV2,
n.attribute2 = c.attribute2 AS check_attribute2_systemLV2,
n.attribute3 = c.attribute3 AS check_attribute3_systemLV2
FROM
check_items_stechsystem2_ctrl2 c LEFT JOIN check_items_stechsystem1_ctrl2 n USING (KEY, idint, barcode, systemLV1)
WHERE
(c.attribute1,c.attribute2,c.attribute3) != (n.attribute1,n.attribute2,n.attribute3);
运行此任务时,将引发以下错误:
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ansible_collections.community.postgresql.plugins.module_utils.database.SQLParseError: PostgreSQL does not support table with more than 3 dots
localhost failed | msg: MODULE FAILURE
See stdout/stderr for the exact error
这是什么意思?
在互联网上,我几乎找不到关于这个错误的信息。
我读到in this issue page,这个错误与一些非ASCII字符有关。如果是,我应该在哪里查找破坏我的剧本的非ASCII字符?
查询中的两个表都具有以下结构:
Column | Type | Collation | Nullable | Default
---------+----------+-----------+----------+---------
key | text | | not null |
idint | text | | |
barcode | text | | |
systemLV1 | integer | | |
systemLV2 | text | | not null |
attribute1 | numeric | | |
attribute2 | smallint | | |
attribute3 | bigint | | |
但是文本类型列被csv文件中包含字符串化数字(最终零填充)数据的列填充。
当我在数据库上手动运行查询时,没有得到任何错误,数据也没有任何奇怪的符号。
1条答案
按热度按时间z8dt9xmd1#
替换查询中的所有多个空格和新行字符解决了这个问题。
然而,这是非常奇怪的,因为在该剧本中,还有其他任务运行具有新行字符的查询。
由于Traceback表明问题是
SQLParseError
,我猜当我在一些文本编辑器上格式化查询字符串时,一些“坏的”新行/制表符/空格字符进入了查询字符串。也有可能我从一些聊天应用程序(如MS Teams)中复制了查询的某些部分,这是一个众所周知的代码剧透。