From 19c04f2326853b7734ddd34a4ab66c1ea4ec6109 Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Wed, 15 Jul 2026 16:17:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=9B=BA=20Access=20CSV=20=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E7=9A=84=20schema=20=E7=B1=BB=E5=9E=8B=E6=98=A0?= =?UTF-8?q?=E5=B0=84=EF=BC=8C=E6=9D=9C=E7=BB=9D=20-5402=20=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _schema_type 只可能输出两种 Access Text ISAM 永远接受的合法值: 日期/时间列 -> DateTime;其余(文本/数值/布尔) -> Text Width 255 (插入时 Access 按目标列真实类型自动强制转换,无需精确声明) - 删除不再使用的 _TYPE_MAP 死代码 - 修正一处误删导致的缩进错误 - 本地集成测试(真实 sync_access, 35043 行, 含 GBK 外字符 ø)通过 --- src/sync_writer.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/sync_writer.py b/src/sync_writer.py index db5ecba..1a869f2 100644 --- a/src/sync_writer.py +++ b/src/sync_writer.py @@ -104,17 +104,6 @@ def _sanitize_rows(rows, fields, import_col, limits, dt_cols): return out -# 列类型 -> schema.ini 类别映射(文本/日期/数值) -_TYPE_MAP = { - "VARCHAR": "text", "CHAR": "text", "TEXT": "text", "LONGVARCHAR": "text", - "LONGCHAR": "text", "MEMO": "text", - "DATETIME": "date", "DATE": "date", "TIME": "date", - "INTEGER": "int", "SMALLINT": "int", "BIGINT": "int", "TINYINT": "int", - "COUNTER": "int", "AUTOINCREMENT": "int", - "DOUBLE": "float", "SINGLE": "float", "REAL": "float", - "DECIMAL": "float", "NUMERIC": "float", "CURRENCY": "float", "MONEY": "float", - "BIT": "bit", "YESNO": "bit", "BOOLEAN": "bit", -} def _access_cols(cn, table): @@ -128,14 +117,17 @@ def _access_cols(cn, table): def _schema_type(col, meta): - tn, size = meta.get(col, ("", None)) - cat = _TYPE_MAP.get(tn, "text") - if cat == "text": - # ACE 对部分表(尤其 ADOX 建的)报告的列宽可能为 None, - # Text ISAM 不接受 Width 0,故无宽度时兜底 255 - return f"Text Width {size if size else 255}" - return {"date": "DateTime", "int": "Integer", - "float": "Double", "bit": "Bit"}.get(cat, "Text Width 0") + """只输出 Access Text ISAM 永远接受的两种合法值,杜绝 -5402 非法选项。 + + - 日期/时间列 -> DateTime(Text 驱动据此解析日期) + - 其余(文本/数值/布尔等)-> Text Width 255 + (插入时 Access 按目标列真实类型自动强制转换,故无需精确声明) + """ + tn, _ = meta.get(col, ("", None)) + t = (tn or "").upper() + if "DAT" in t or "DATE" in t or "TIME" in t: + return "DateTime" + return "Text Width 255" def _csv_val(v):