已合并
支持数据库分实例隔离数据 #472
陈卉创建于 5 天前
支持数据库分实例隔离数据 #472
已合并
共 9 个文件变更+89-20
| @@ -5,7 +5,7 @@ from datetime import datetime | |||
| 5 | import logging | 5 | import logging |
| 6 | from typing import Optional, Any | 6 | from typing import Optional, Any |
| 7 | import json | 7 | import json |
| 8 | -from sqlalchemy import Column, Integer, String, DateTime, JSON, Boolean, Float, text, inspect, Index | 8 | +from sqlalchemy import Column, Integer, String, DateTime, JSON, Boolean, Float, Text, text, inspect, Index |
| 9 | from sqlalchemy.engine import make_url | 9 | from sqlalchemy.engine import make_url |
| 10 | from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker | 10 | from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker |
| 11 | from sqlalchemy.orm import DeclarativeBase | 11 | from sqlalchemy.orm import DeclarativeBase |
| @@ -106,12 +106,21 @@ class SQLAlchemyHandler(DBHandler): | |||
| 106 | 106 | ||
| 107 | def _get_sqlalchemy_type(self, data_type: str, length: Optional[int] = None): | 107 | def _get_sqlalchemy_type(self, data_type: str, length: Optional[int] = None): |
| 108 | """将数据类型字符串转换为 SQLAlchemy 类型""" | 108 | """将数据类型字符串转换为 SQLAlchemy 类型""" |
| 109 | + key = data_type.lower() | ||
| 110 | + # 大文本族:mysql 用 MEDIUMTEXT/LONGTEXT 变体(分别 16MB / 4GB), | ||
| 111 | + # 其余方言(pg/sqlite/...)用 Text(pg TEXT 无界、sqlite TEXT 无界)。 | ||
| 112 | + if key in ("mediumtext", "longtext"): | ||
| 113 | + if self._get_dialect_name() == "mysql": | ||
| 114 | + from sqlalchemy.dialects.mysql import MEDIUMTEXT, LONGTEXT | ||
| 115 | + | ||
| 116 | + return LONGTEXT if key == "longtext" else MEDIUMTEXT | ||
| 117 | + return Text | ||
| 109 | type_map = { | 118 | type_map = { |
| 110 | "integer": Integer, | 119 | "integer": Integer, |
| 111 | "int": Integer, | 120 | "int": Integer, |
| 112 | "string": String, | 121 | "string": String, |
| 113 | "str": String, | 122 | "str": String, |
| 114 | - "text": String, | 123 | + "text": Text, |
| 115 | "datetime": DateTime, | 124 | "datetime": DateTime, |
| 116 | "json": JSON, | 125 | "json": JSON, |
| 117 | "boolean": Boolean, | 126 | "boolean": Boolean, |
| @@ -122,7 +131,7 @@ class SQLAlchemyHandler(DBHandler): | |||
| 122 | "number": Float, | 131 | "number": Float, |
| 123 | "real": Float, | 132 | "real": Float, |
| 124 | } | 133 | } |
| 125 | - sa_type = type_map.get(data_type.lower(), String) | 134 | + sa_type = type_map.get(key, String) |
| 126 | if sa_type == String and length: | 135 | if sa_type == String and length: |
| 127 | return String(length) | 136 | return String(length) |
| 128 | return sa_type | 137 | return sa_type |
| @@ -142,10 +151,16 @@ class SQLAlchemyHandler(DBHandler): | |||
| 142 | data_type = col_def.data_type.lower() | 151 | data_type = col_def.data_type.lower() |
| 143 | if data_type in {"integer", "int"}: | 152 | if data_type in {"integer", "int"}: |
| 144 | return "INTEGER" | 153 | return "INTEGER" |
| 145 | - if data_type in {"string", "str", "text"}: | 154 | + if data_type in {"string", "str"}: |
| 146 | if col_def.length: | 155 | if col_def.length: |
| 147 | return f"VARCHAR({col_def.length})" | 156 | return f"VARCHAR({col_def.length})" |
| 148 | return "VARCHAR" | 157 | return "VARCHAR" |
| 158 | + if data_type in {"mediumtext", "longtext"}: | ||
| 159 | + if self._get_dialect_name() == "mysql": | ||
| 160 | + return "LONGTEXT" if data_type == "longtext" else "MEDIUMTEXT" | ||
| 161 | + return "TEXT" | ||
| 162 | + if data_type == "text": | ||
| 163 | + return "TEXT" | ||
| 149 | if data_type == "datetime": | 164 | if data_type == "datetime": |
| 150 | return "DATETIME" | 165 | return "DATETIME" |
| 151 | if data_type == "json": | 166 | if data_type == "json": |