加固 Access CSV 导入的 schema 类型映射,杜绝 -5402 非法选项

- _schema_type 只可能输出两种 Access Text ISAM 永远接受的合法值:
  日期/时间列 -> DateTime;其余(文本/数值/布尔) -> Text Width 255
  (插入时 Access 按目标列真实类型自动强制转换,无需精确声明)
- 删除不再使用的 _TYPE_MAP 死代码
- 修正一处误删导致的缩进错误
- 本地集成测试(真实 sync_access, 35043 行, 含 GBK 外字符 ø)通过
This commit is contained in:
Misaka_Company
2026-07-15 16:17:56 +08:00
parent 7c849883e4
commit 19c04f2326

View File

@@ -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 非法选项。
- 日期/时间列 -> DateTimeText 驱动据此解析日期)
- 其余(文本/数值/布尔等)-> 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):