加固 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:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user