Update DuckDb

This commit is contained in:
sunkaixuan 2025-04-20 13:33:41 +08:00
parent 00afa949ac
commit e605ff71a1
2 changed files with 63 additions and 103 deletions

View File

@ -81,67 +81,63 @@ namespace SqlSugar.DuckDB
}
public static List<KeyValuePair<string, CSharpDataType>> MappingTypesConst = new List<KeyValuePair<string, CSharpDataType>>(){
new KeyValuePair<string, CSharpDataType>("int2",CSharpDataType.@short),
new KeyValuePair<string, CSharpDataType>("int1",CSharpDataType.@byte),
new KeyValuePair<string, CSharpDataType>("smallint",CSharpDataType.@short),
new KeyValuePair<string, CSharpDataType>("int4",CSharpDataType.@int),
new KeyValuePair<string, CSharpDataType>("serial",CSharpDataType.@int),
new KeyValuePair<string, CSharpDataType>("integer",CSharpDataType.@int),
new KeyValuePair<string, CSharpDataType>("int8",CSharpDataType.@long),
new KeyValuePair<string, CSharpDataType>("bigint",CSharpDataType.@long),
new KeyValuePair<string, CSharpDataType>("float4",CSharpDataType.@float),
new KeyValuePair<string, CSharpDataType>("float4",CSharpDataType.Single),
new KeyValuePair<string, CSharpDataType>("real",CSharpDataType.@float),
new KeyValuePair<string, CSharpDataType>("float8",CSharpDataType.@double),
new KeyValuePair<string, CSharpDataType>("double precision",CSharpDataType.@int),
new KeyValuePair<string, CSharpDataType>("numeric",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("decimal",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("path",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("point",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("polygon",CSharpDataType.@decimal),
// 整数类型
new KeyValuePair<string, CSharpDataType>("TINYINT", CSharpDataType.@byte), // 1字节
new KeyValuePair<string, CSharpDataType>("SMALLINT", CSharpDataType.@short), // 2字节
new KeyValuePair<string, CSharpDataType>("INTEGER", CSharpDataType.@int), // 4字节
new KeyValuePair<string, CSharpDataType>("BIGINT", CSharpDataType.@long), // 8字节
new KeyValuePair<string, CSharpDataType>("UTINYINT", CSharpDataType.@byte), // 无符号
new KeyValuePair<string, CSharpDataType>("USMALLINT", CSharpDataType.@short), // 无符号
new KeyValuePair<string, CSharpDataType>("UINTEGER", CSharpDataType.@int), // 无符号
new KeyValuePair<string, CSharpDataType>("UBIGINT", CSharpDataType.@long), // 无符号
new KeyValuePair<string, CSharpDataType>("boolean",CSharpDataType.@bool),
new KeyValuePair<string, CSharpDataType>("bool",CSharpDataType.@bool),
new KeyValuePair<string, CSharpDataType>("box",CSharpDataType.@bool),
new KeyValuePair<string, CSharpDataType>("bytea",CSharpDataType.byteArray),
// 浮点数类型
new KeyValuePair<string, CSharpDataType>("FLOAT", CSharpDataType.@float), // 4字节
new KeyValuePair<string, CSharpDataType>("DOUBLE", CSharpDataType.@double), // 8字节
new KeyValuePair<string, CSharpDataType>("REAL", CSharpDataType.@float), // 别名 FLOAT
new KeyValuePair<string, CSharpDataType>("DECIMAL", CSharpDataType.@decimal), // 精确小数
new KeyValuePair<string, CSharpDataType>("NUMERIC", CSharpDataType.@decimal), // 别名 DECIMAL
new KeyValuePair<string, CSharpDataType>("varchar",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("character varying",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("geometry",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("name",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("text",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("char",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("character",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("cidr",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("circle",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("tsquery",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("tsvector",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("txid_snapshot",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("uuid",CSharpDataType.Guid),
new KeyValuePair<string, CSharpDataType>("xml",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("json",CSharpDataType.@string),
// 布尔类型
new KeyValuePair<string, CSharpDataType>("BOOLEAN", CSharpDataType.@bool),
new KeyValuePair<string, CSharpDataType>("BOOL", CSharpDataType.@bool), // 别名
new KeyValuePair<string, CSharpDataType>("interval",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("lseg",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("macaddr",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("money",CSharpDataType.@decimal),
new KeyValuePair<string, CSharpDataType>("timestamp",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("timestamp with time zone",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("timestamptz",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("timestamp without time zone",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("date",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("time",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("time with time zone",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("timetz",CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("time without time zone",CSharpDataType.DateTime),
// 字符串类型
new KeyValuePair<string, CSharpDataType>("VARCHAR", CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("CHAR", CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("TEXT", CSharpDataType.@string), // 不限长度
new KeyValuePair<string, CSharpDataType>("STRING", CSharpDataType.@string), // 别名
new KeyValuePair<string, CSharpDataType>("bit",CSharpDataType.byteArray),
new KeyValuePair<string, CSharpDataType>("bit varying",CSharpDataType.byteArray),
new KeyValuePair<string, CSharpDataType>("varbit",CSharpDataType.@byte),
new KeyValuePair<string, CSharpDataType>("time",CSharpDataType.TimeSpan),
new KeyValuePair<string, CSharpDataType>("public.geometry",CSharpDataType.@object),
new KeyValuePair<string, CSharpDataType>("public.geography",CSharpDataType.@object),
new KeyValuePair<string, CSharpDataType>("inet",CSharpDataType.@object)
// 二进制类型
new KeyValuePair<string, CSharpDataType>("BLOB", CSharpDataType.byteArray),
new KeyValuePair<string, CSharpDataType>("BYTEA", CSharpDataType.byteArray), // PostgreSQL风格
// 日期时间类型
new KeyValuePair<string, CSharpDataType>("TIMESTAMP", CSharpDataType.DateTime), // 无时区
new KeyValuePair<string, CSharpDataType>("DATE", CSharpDataType.DateTime),
new KeyValuePair<string, CSharpDataType>("TIME", CSharpDataType.TimeSpan),
new KeyValuePair<string, CSharpDataType>("TIMESTAMP_S", CSharpDataType.DateTime), // 秒级精度
new KeyValuePair<string, CSharpDataType>("TIMESTAMP_MS", CSharpDataType.DateTime), // 毫秒级
new KeyValuePair<string, CSharpDataType>("TIMESTAMP_NS", CSharpDataType.DateTime), // 纳秒级
// 特殊类型
new KeyValuePair<string, CSharpDataType>("UUID", CSharpDataType.Guid),
new KeyValuePair<string, CSharpDataType>("JSON", CSharpDataType.@string), // 存储为字符串
new KeyValuePair<string, CSharpDataType>("ENUM", CSharpDataType.@string), // 枚举实际存储为字符串
// 几何类型DuckDB支持简单几何类型
new KeyValuePair<string, CSharpDataType>("POINT", CSharpDataType.@object), // 需自定义解析
new KeyValuePair<string, CSharpDataType>("LINESTRING", CSharpDataType.@object),
new KeyValuePair<string, CSharpDataType>("POLYGON", CSharpDataType.@object),
// 数组类型(需特殊处理)
new KeyValuePair<string, CSharpDataType>("INTEGER[]", CSharpDataType.@object), // 实际为int[]
new KeyValuePair<string, CSharpDataType>("VARCHAR[]", CSharpDataType.@object), // 实际为string[]
new KeyValuePair<string, CSharpDataType>("DOUBLE[]", CSharpDataType.@object), // 实际为double[]
// 结构体/Map类型DuckDB 1.0+支持)
new KeyValuePair<string, CSharpDataType>("STRUCT", CSharpDataType.@object), // 需动态解析
new KeyValuePair<string, CSharpDataType>("MAP", CSharpDataType.@object) // 键值对
};
public override List<string> StringThrow
{

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Text;
@ -310,48 +311,9 @@ namespace SqlSugar.DuckDB
/// <returns></returns>
public override bool CreateDatabase(string databaseName, string databaseDirectory = null)
{
if (databaseDirectory != null)
{
if (!FileHelper.IsExistDirectory(databaseDirectory))
{
FileHelper.CreateDirectory(databaseDirectory);
}
}
// var oldDatabaseName = this.Context.Ado.Connection.Database;
//var connection = this.Context.CurrentConnectionConfig.ConnectionString;
//connection = connection.Replace(oldDatabaseName, "");
if (this.Context.Ado.IsValidConnection())
{
return true;
}
var newDb = this.Context.CopyNew();
newDb.Ado.Connection.ChangeDatabase("highgo");
newDb.Open();
if (!GetDataBaseList(newDb).Any(it => it.Equals(databaseName, StringComparison.CurrentCultureIgnoreCase)))
{
newDb.Ado.ExecuteCommand(string.Format(CreateDataBaseSql, this.SqlBuilder.SqlTranslationLeft+databaseName+this.SqlBuilder.SqlTranslationRight, databaseDirectory));
}
newDb.Close();
return true;
}
public override bool AddRemark(EntityInfo entity)
{
var db = this.Context;
var columns = entity.Columns.Where(it => it.IsIgnore == false).ToList();
foreach (var item in columns)
{
if (item.ColumnDescription != null)
{
db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription);
}
}
//table remak
if (entity.TableDescription != null)
{
db.DbMaintenance.AddTableRemark(entity.DbTableName, entity.TableDescription);
}
var newdb = this.Context.CopyNew();
newdb.Open();
newdb.Close();
return true;
}
public override bool CreateTable(string tableName, List<DbColumnInfo> columns, bool isCreatePrimaryKey = true)
@ -404,9 +366,11 @@ namespace SqlSugar.DuckDB
string addItem = string.Format(this.CreateTableColumn, this.SqlBuilder.GetTranslationColumnName(columnName.ToLower(isAutoToLowerCodeFirst)), dataType, dataSize, nullType, primaryKey, "");
if (item.IsIdentity)
{
string length = dataType.Substring(dataType.Length - 1);
string identityDataType = "serial" + length;
addItem = addItem.Replace(dataType, identityDataType);
var seqName =GetSchema()+tableName + "_" + item.DbColumnName+ "_sequence";
var seqSql=$@"
CREATE SEQUENCE IF NOT EXISTS ""{seqName}""";
this.Context.Ado.ExecuteCommand(seqSql);
addItem += $" DEFAULT NEXTVAL('{seqName}') ";
}
columnArray.Add(addItem);
}
@ -490,7 +454,7 @@ namespace SqlSugar.DuckDB
}
private string GetSchema()
{
var schema = "public";
var schema = "main";
if (System.Text.RegularExpressions.Regex.IsMatch(this.Context.CurrentConnectionConfig.ConnectionString.ToLower(), "searchpath="))
{
var regValue = System.Text.RegularExpressions.Regex.Match(this.Context.CurrentConnectionConfig.ConnectionString.ToLower(), @"searchpath\=(\w+)").Groups[1].Value;