Ansible执行PostgreSQL查询报错:不支持含3个以上点的表
问题:Ansible PostgreSQL Copy任务报错"PostgreSQL does not support table with more than 3 dots"
任务代码
- 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
SQL模板(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
涉及表结构
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 | | |
表中text类型列的数据来自CSV文件中的字符串化数值(可能带前导零)。
错误含义解析
这个错误并非PostgreSQL原生报错,而是Ansible community.postgresql.postgresql_copy模块内部SQL解析逻辑抛出的异常。模块在解析SQL语句时,可能误将某些合法结构识别为超过3个点的表名格式(例如schema.table.column是2个点,属于合法格式;但模块若识别出a.b.c.d这类结构,会判定为非法表名)。
手动执行SQL正常,说明SQL本身语法合法,问题出在模块的解析逻辑对SQL的处理上,而非PostgreSQL服务器端。
非ASCII字符排查方向
- 检查SQL模板文件编码与隐藏字符:确保
query1.sql.j2使用UTF-8编码,无全角空格、特殊换行符、不可见控制字符等非ASCII内容。可通过以下命令检查:# 查找文件中的非打印/非空格字符 grep -n '[^[:print:][:space:]]' query1.sql.j2 # 查看文件编码 file query1.sql.j2 - 检查Ansible变量内容:确认
db_host、db_username、log_base_path等变量值中无中文标点、全角符号等非ASCII字符。可添加debug任务打印变量:- name: Debug variables debug: var: "{{ item }}" loop: - db_host - db_username - db_database - log_base_path - 验证数据库对象名称:虽然手动执行SQL正常,但可确认表名、列名是否包含非ASCII字符,执行以下SQL查询:
-- 检查表名 SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'; -- 检查列名 SELECT column_name FROM information_schema.columns WHERE table_name IN ('check_items_stechsystem2_ctrl2', 'check_items_stechsystem1_ctrl2'); - 清理SQL模板格式:移除模板中多余的缩进、空白字符,或将多行SQL合并为一行测试,避免模块解析时误判。
临时替代方案
可绕过模块的SQL解析逻辑,直接用command模块调用psql命令完成导出:
- name: run query1 and dump data in csv via psql command: > psql -h {{ db_host }} -U {{ db_username }} -d {{ db_database }} -p {{ db_database_port }} -c "\copy ({{ lookup('template', 'query1.sql.j2') }}) TO '{{ log_base_path }}/results1.csv' WITH (FORMAT CSV, DELIMITER ';', HEADER)" environment: PGPASSWORD: '{{ db_password }}'
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

