lith 3 years ago
parent
commit
3d55da499f

+ 1 - 1
Publish/ReleaseFile/docker-image/制作镜像.md

@@ -38,7 +38,7 @@ cd /root/image
 
 #构建镜像并推送到 Docker Hub 
 cd sqler
-docker buildx build . -t serset/sqler:3.0.7 -t serset/sqler --platform=linux/amd64,linux/arm64,linux/arm/v7 --push
+docker buildx build . -t serset/sqler:3.0.8-temp -t serset/sqler --platform=linux/amd64,linux/arm64,linux/arm/v7 --push
  
 
 

+ 29 - 2
README.md

@@ -163,7 +163,7 @@ MySql.DropDataBase
 
 ---------------------------------
 # 3 mssql
-Sqler可以对msql(Sql Server)数据库进行 备份、还原、创建、删除。
+Sqler可以对mssql(Sql Server)数据库进行 备份、还原、创建、删除。
 
 
  
@@ -259,8 +259,35 @@ dotnet Sqler.dll SqlServer.DropDataBase \
 ```
 
 
+
+---------------------------------
+# 4 执行sql语句
+Sqler可以直接对sqlite/mysql/mssql数据库执行sql语句并返回结果。
+
+
+demo:
+``` bash
+docker run --rm -it \
+serset/sqler  \
+dotnet Sqler.dll SqlRun.Exec --quiet \
+--sql "SHOW DATABASES WHERE `Database` NOT IN ('information_schema','mysql', 'performance_schema', 'sys');" \
+--format Values \
+--set "SqlRun.Config.type=mysql" \
+--set "SqlRun.Config.ConnectionString=Data Source=sers.cloud;Port=11052;User Id=root;Password=123456;CharSet=utf8;allowPublicKeyRetrieval=true;" 
+```
+
+参数说明:
+``` txt
+--quiet (可选)静默模式,只打印结果信息,忽略info信息
+--sql 执行的sql语句
+--format (可选)显示结果的格式,可为 json(默认值,序列化为json字符串)、AffectedRowCount(仅显示影响行数)、FirstCell(仅返回第一行第一列数据)
+          、Values(通过在行列直接加分隔符的方式返回所有数据,分隔符默认为逗号和换行,可通过--columnSeparator 和 --rowSeparator参数指定)
+--set (可选)设置配置文件(/Data/sqler.json)的值,格式为"name=value"。 连接字符串的name为SqlRun.Config.ConnectionString
+示例: SqlRun.Exec --quiet --sql "select 1" --format Values --set SqlRun.Config.type=sqlite --set "SqlRun.Config.ConnectionString=Data Source=.;Database=Db_Dev;UID=sa;PWD=123456;"
+```
+
 ---------------------------------
-# 4.常驻后台服务
+# 5.常驻后台服务
 
 ## (x.1)配置文件
 	  (x.x.1)把本文件所在目录中的Data拷贝到宿主机

+ 45 - 0
Sqler/Module/Sqler/ConsoleCommand/IEnumeratorExtensions.cs

@@ -0,0 +1,45 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace Vit.Extensions
+{
+    /// <summary>
+    ///  
+    /// </summary>
+    public static partial class IEnumeratorExtensions
+    {
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static List<T> IEnumerator_ToList<T>(this IEnumerator data)
+        {
+            var list = new List<T>();
+            data.Reset();
+            while (data.MoveNext())
+            {
+                list.Add((T)data.Current);
+            }
+            return list;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static List<T> IEnumerable_ToList<T>(this System.Collections.IEnumerable data) //ICollection data
+        {
+            return data?.GetEnumerator().IEnumerator_ToList<T>();
+        }      
+
+    }
+}

+ 79 - 0
Sqler/Module/Sqler/ConsoleCommand/SqlRunCommand.cs

@@ -0,0 +1,79 @@
+using App.Module.Sqler.Logical;
+using Dapper;
+using System;
+using System.Data;
+using Vit.ConsoleUtil;
+using Vit.Db.Util.Data;
+using Vit.Extensions;
+using System.Linq;
+
+namespace App.Module.Sqler.ConsoleCommand
+{
+    public class SqlRunCommand
+    {
+        #region Exec
+        [Command("SqlRun.Exec")]
+        [Remarks("执行sql语句。参数说明:")]
+        [Remarks("--quiet (可选)静默模式,只打印结果信息,忽略info信息")]
+        [Remarks("--sql 执行的sql语句")]
+        [Remarks("--format (可选)显示结果的格式,可为 json(默认值,序列化为json字符串)、AffectedRowCount(仅显示影响行数)、FirstCell(仅返回第一行第一列数据)、Values(通过在行列直接加分隔符的方式返回所有数据,分隔符默认为逗号和换行,可通过--columnSeparator 和 --rowSeparator参数指定)")]
+        [Remarks("--set (可选)设置配置文件(/Data/sqler.json)的值,格式为\"name=value\"。 连接字符串的name为SqlRun.Config.ConnectionString")]
+        [Remarks("示例: SqlRun.Exec --quiet --sql \"select 1\" --format Values --set SqlRun.Config.type=sqlite --set \"SqlRun.Config.ConnectionString=Data Source=.;Database=Db_Dev;UID=sa;PWD=123456;\" ")]
+        public static void Exec(string[] args)
+        {
+            ConsoleHelp.Log("执行sql语句...");
+
+            string sql = ConsoleHelp.GetArg(args, "--sql");
+            string format = ConsoleHelp.GetArg(args, "--format");
+
+            using (var conn = ConnectionFactory.GetConnection(SqlerHelp.sqlerConfig.GetByPath<Vit.Db.Util.Data.ConnectionInfo>("SqlRun.Config")))
+            {
+                string str;
+                switch (format) 
+                {
+                    case "AffectedRowCount":
+                        {
+                            str = conn.Execute(sql).ToString();                           
+                            break;
+                        }
+                    case "FirstCell":
+                        {
+                            str = conn.ExecuteScalar(sql)?.ToString();
+                            break;
+                        }
+                    case "Values":
+                        {
+                            string columnSeparator = ConsoleHelp.GetArg(args, "--columnSeparator") ?? ",";
+                            string rowSeparator = ConsoleHelp.GetArg(args, "--rowSeparator") ?? Environment.NewLine;
+
+                            var dt = conn.ExecuteDataTable(sql);
+
+
+                            str = dt.Rows.IEnumerable_ToList<DataRow>()
+                                .Select(row =>
+                                    row.ItemArray.Select(m => m.Serialize()).StringJoin(columnSeparator)
+                                ).StringJoin(rowSeparator);
+                            break;
+                        }
+                    default:
+                        {
+                            var dt = conn.ExecuteDataTable(sql);
+                            str = dt.Serialize();
+                            break;
+                        }
+                }
+               
+                Console.Write(str);
+            }
+
+            ConsoleHelp.Log("操作成功");
+        }
+        #endregion
+
+ 
+        
+
+       
+
+    }
+}

+ 55 - 6
Sqler/Program.cs

@@ -4,6 +4,8 @@ using System;
 using Vit.ConsoleUtil;
 using Vit.Core.Module.Log;
 using Vit.Extensions;
+using System.Linq;
+using App.Module.Sqler.Logical;
 
 namespace App
 {
@@ -14,15 +16,35 @@ namespace App
             //var arg = new System.Collections.Generic.List<string>() {"SqlVersion.CurrentVersion" };
             //arg.AddRange(new[] { "--DataPath", @"W:\code\Data" });
             //args = arg.ToArray();
+            if (args == null) args = new string[] { };
+
+            args = new string[] { "SqlRun.Exec"
+                ,"--quiet"
+                ,"--sql","SHOW DATABASES WHERE `Database` NOT IN ('information_schema','mysql', 'performance_schema', 'sys');"
+                ,"--format","Values"
+                ,"--set","SqlRun.Config.type=mysql"
+                ,"--set","SqlRun.Config.ConnectionString=Data Source=lanxing.cloud;Port=11052;User Id=root;Password=123456;CharSet=utf8;allowPublicKeyRetrieval=true;"
+            };
+
+
+
+            #region (x.2) --quiet
+            if (args.Any(arg => arg == "--quiet") == true)
+            {
+                Logger.OnLog = (level, msg) => { };
+            }
+            else
+            {
+                Logger.OnLog = (level, msg) => { Console.WriteLine((level == Level.INFO ? "" : "[" + level + "]") + msg); };
+                //Logger.OnLog = (level, msg) => { Console.WriteLine("[" + level.ToString().ToLower() + "]" + msg); };
+            }
+            #endregion
 
-            var runAsCmd = (args != null && args.Length >= 1 && false == args[0]?.StartsWith("-"));
 
 
-            Logger.OnLog = (level, msg) => { Console.WriteLine((level == Level.INFO ? "" : "[" + level + "]") + msg); };  
-            //Logger.OnLog = (level, msg) => { Console.WriteLine("[" + level.ToString().ToLower() + "]" + msg); };
 
 
-            //(x.1) 初始化Sqler
+            //(x.3) 初始化Sqler
             try
             { 
                 Logger.Info("[Sqler] version: "+ System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetEntryAssembly().Location).FileVersion );
@@ -36,8 +58,35 @@ namespace App
                 return;
             }
 
-         
 
+
+
+            #region (x.4)--set path=value
+            {
+                for (var i = 1; i < args.Length; i++)
+                {
+                    if (args[i - 1] == "--set")
+                    {
+                        try
+                        {
+                            var str = args[i];
+                            var ei = str?.IndexOf('=') ?? -1;
+                            if (ei < 1) continue;
+
+                            var path = str.Substring(0, ei);
+                            var value = str.Substring(ei + 1);
+
+                            SqlerHelp.sqlerConfig.root.ValueSetByPath(value, path.Split('.'));
+                        }
+                        catch { }
+                    }
+                }
+            }
+            #endregion
+
+
+            //(x.5)
+            var runAsCmd = (args.Length >= 1 && false == args[0]?.StartsWith("-"));
             if (runAsCmd)
             {
                 Vit.ConsoleUtil.ConsoleHelp.Log = (msg) => { Logger.Info(msg);  };
@@ -47,7 +96,7 @@ namespace App
 
 
 
-            //(x.3)启动http服务
+            //(x.6)启动http服务
             try
             {
                 CreateWebHostBuilder(args).Build().Run();

+ 1 - 1
Sqler/Sqler.csproj

@@ -7,7 +7,7 @@
 
 	<PropertyGroup>
 		<TargetFramework>netcoreapp2.1</TargetFramework>
-		<Version>3.0.7</Version>
+		<Version>3.0.8-temp</Version>
 		<Description>https://github.com/serset/Sqler</Description>
 		<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
 		<PreserveCompilationContext>true</PreserveCompilationContext>