{ "cells": [ { "cell_type": "markdown", "id": "19839fa7", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "source": [ "使用 .net 程序操作数据库\n", "=======================\n", "除了使用SQL内核执行SQL语句直接操作数据库,使用最多的是使用用.net程序操作数据库:\n", "+ ado.net 原生操作\n", "+ 使用ORM框架,比如 Daper、EFCore、SqlSugar、FreeSQL等" ] }, { "cell_type": "markdown", "id": "4ca948bd", "metadata": {}, "source": [ "## 初始化" ] }, { "cell_type": "code", "execution_count": 16, "id": "4f5767d2", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
Installed Packages
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Installed Packages
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#!import \"./Base.ipynb\"\n", "\n", "//共享\n", "#r \"nuget:Microsoft.Data.SqlClient\"\n", "#r \"nuget:MySql.Data\"\n", "#r \"nuget:Npgsql\"\n", "#r \"nuget:Microsoft.Data.Sqlite\"\n", "#r \"nuget:DuckDB.NET.Data.Full\"\n", "\n", "#r \"nuget:Dapper\"\n", "\n", "#r \"nuget:Microsoft.EntityFrameworkCore\"\n", "#r \"nuget:Microsoft.EntityFrameworkCore.SqlServer\"\n", "#r \"nuget:Microsoft.EntityFrameworkCore.Sqlite\"\n", "#r \"nuget:Npgsql.EntityFrameworkCore.PostgreSQL\"\n", "#r \"nuget:MySql.EntityFrameworkCore\"\n", "//#r \"nuget:Pomelo.EntityFrameworkCore.MySql\"\n", "#r \"nuget:MongoDB.EntityFrameworkCore\"\n", "\n", "global using System.Text.Json;\n", "global using System.Text.Json.Schema;\n", "global using System.Text.Json.Serialization;\n", "\n", "global using System.Data;\n", "global using System.Data.Common;\n", "global using System.Data.SqlTypes;\n", "global using System.Data.SqlClient;\n", "//global using System.Data.OracleClient;\n", "\n", "global using Microsoft.Data.SqlClient;\n", "global using Microsoft.Data.SqlClient.Server;\n", "\n", "global using MySql.Data;\n", "global using MySql.Data.Types;\n", "global using MySql.Data.MySqlClient;\n", "\n", "global using Microsoft.Data.Sqlite;\n", "\n", "global using DuckDB.NET.Data;\n", "global using DuckDB.NET.Data.DataChunk;\n", "\n", "global using Dapper;\n", "\n", "global using Npgsql;\n", "global using Npgsql.Schema;\n", "global using Npgsql.PostgresTypes;\n", "global using Npgsql.TypeMapping;\n", "global using Npgsql.Util;\n", "global using Npgsql.NameTranslation;\n", "global using Npgsql.BackendMessages;\n", "\n", "\n", "global using Microsoft.EntityFrameworkCore;\n", "global using Microsoft.EntityFrameworkCore.SqlServer;\n", "global using Microsoft.EntityFrameworkCore.Sqlite;\n", "global using Npgsql.EntityFrameworkCore.PostgreSQL;\n", "global using MySql.EntityFrameworkCore;\n", "global using MongoDB.EntityFrameworkCore;\n", "\n", "//共享方法\n", "public static List DatatableToStudent(DataTable studentTable)\n", "{\n", " var students = new List();\n", " if(studentTable == null)\n", " {\n", " return students;\n", " }\n", "\n", " if(studentTable.Columns.Count ==0)\n", " {\n", " return students;\n", " }\n", "\n", " if(studentTable.Rows.Count <=0)\n", " {\n", " return students;\n", " }\n", "\n", " foreach(DataRow row in studentTable.Rows)\n", " {\n", " var student = new Student()\n", " {\n", " Id = (int)row[\"Id\"],\n", " Name = row[\"Name\"] == DBNull.Value ? \"\" : (string)row[\"Name\"].ToString(),\n", " Age = row[\"Age\"] == DBNull.Value ? 0 : (int)row[\"Age\"]\n", " };\n", "\n", " students.Add(student);\n", " }\n", "\n", " return students;\n", "}" ] }, { "cell_type": "markdown", "id": "c66c5da7", "metadata": {}, "source": [ "## 使用 ADO.NET" ] }, { "cell_type": "markdown", "id": "6b1ebc4f", "metadata": {}, "source": [ "### SQL Server 数据库(2019为例)" ] }, { "cell_type": "code", "execution_count": 2, "id": "f64d17d8", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "查询到: 528 行数据\n", "前2行:[{\"Id\":1,\"Name\":\"吕宇宁\",\"Age\":74},{\"Id\":6,\"Name\":\"林杰宏\",\"Age\":73}]\n" ] } ], "source": [ "//Ado.Net 操作SQL Server\n", "{\n", " DataSet ds = new DataSet();\n", "\n", " using(var mssqlConnection = new SqlConnection(SharedDbConnect.MsSqlConnectionString))\n", " {\n", " mssqlConnection.Open();\n", "\n", " var querySql = \"select * FROM student where age >@age;\";\n", " SqlParameter[] parameters = new SqlParameter[]\n", " {\n", " new SqlParameter()\n", " {\n", " ParameterName = \"age\",\n", " SqlDbType = SqlDbType.Int,\n", " Value = 50,\n", " Direction = ParameterDirection.Input,\n", " Size = 4,\n", " DbType = DbType.Int32,\n", " IsNullable = false,\n", " }\n", " };\n", " var command = new SqlCommand(querySql, mssqlConnection);\n", " command.Parameters.AddRange(parameters);\n", "\n", " var adapter = new SqlDataAdapter(command);\n", " adapter.Fill(ds);\n", "\n", " mssqlConnection.Close();\n", " mssqlConnection.Dispose();\n", " }\n", "\n", " var students = DatatableToStudent(ds.Tables[0]);\n", "\n", " Console.WriteLine($\"查询到: {students.Count()} 行数据\");\n", " var jsonText = System.Text.Json.JsonSerializer.Serialize(students.Take(2), new System.Text.Json.JsonSerializerOptions()\n", " {\n", " Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n", " WriteIndented = false,\n", " });\n", "\n", " Console.WriteLine($\"前2行:{jsonText}\");\n", "}" ] }, { "cell_type": "markdown", "id": "a604fbea", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "source": [ "### MySQL" ] }, { "cell_type": "code", "execution_count": 20, "id": "90085b98", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Id Name Age \n", "1 江子韬 28 \n", "2 苏震南 48 \n" ] } ], "source": [ "//Ado.Net 操作MySQL\n", "{\n", " //查询数据\n", " DataSet ds = new DataSet();\n", "\n", " using(var sqlConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString))\n", " {\n", " sqlConnection.Open();\n", "\n", " var querySql = \"SELECT * FROM `Student` LIMIT 2;\";\n", " var command = new MySqlCommand(querySql, sqlConnection);\n", "\n", " var adapter = new MySqlDataAdapter(command);\n", " adapter.Fill(ds);\n", "\n", " sqlConnection.Close();\n", " sqlConnection.Dispose();\n", " }\n", "\n", " //输出数据\n", " var dt = ds.Tables[0];\n", " int padRightCount = 15;\n", "\n", " //输出列\n", " List columnNames = new List(100);\n", " foreach(DataColumn c in dt.Columns)\n", " {\n", " columnNames.Add(c.ColumnName.PadRight(padRightCount));\n", " }\n", "\n", " Console.WriteLine(string.Join(\"\", columnNames));\n", "\n", " //输出数据\n", " foreach(DataRow row in dt.Rows)\n", " {\n", " List rowItemValues = new List(100);\n", "\n", " for(int i=0; i columnNames = new List(100);\n", " foreach(DataColumn c in dt.Columns)\n", " {\n", " columnNames.Add(c.ColumnName.PadRight(padRightCount));\n", " }\n", "\n", " Console.WriteLine(string.Join(\"\", columnNames));\n", "\n", " //输出数据\n", " foreach(DataRow row in dt.Rows)\n", " {\n", " List rowItemValues = new List(100);\n", "\n", " for(int i=0; i columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n", " Console.WriteLine(string.Join(\"\", columnNames));\n", "\n", " //循环输出行数据\n", " while (await reader.ReadAsync())\n", " {\n", " List rowItemValues = new List(100);\n", " for(int i=0; i(i).ToString();\n", " rowItemValues.Add(valueText.PadRight(padRightCount));\n", " }\n", "\n", " Console.WriteLine(string.Join(\"\",rowItemValues));\n", " }\n", " }\n", "}" ] }, { "cell_type": "markdown", "id": "e1c9381b", "metadata": {}, "source": [ "### SQLite" ] }, { "cell_type": "code", "execution_count": 23, "id": "96de0cac", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Id Name Age \n", "1 龚致远 70 \n", "2 潘宇宁 48 \n", "3 陶杰宏 5 \n", "4 彭晓明 46 \n", "5 江震南 63 \n" ] } ], "source": [ "//Ado.Net 操作SQLite\n", "{\n", " //查询数据\n", " DataSet ds = new DataSet();\n", " int padRightCount = 15;\n", "\n", " using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString))\n", " {\n", " sqlConnection.Open();\n", " \n", " var querySql = \n", " \"\"\"\n", " SELECT * FROM Student LIMIT 5;\n", " \"\"\";\n", " var cmd = sqlConnection.CreateCommand();\n", " cmd.CommandType = CommandType.Text;\n", " cmd.CommandText = querySql;\n", "\n", " using (var reader = await cmd.ExecuteReaderAsync())\n", " {\n", " //输出列名\n", " List columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n", " Console.WriteLine(string.Join(\"\", columnNames));\n", "\n", " //循环输出行数据\n", " while (await reader.ReadAsync())\n", " {\n", " List rowItemValues = new List(100);\n", " for(int i=0; i(i).ToString();\n", " rowItemValues.Add(valueText.PadRight(padRightCount));\n", " }\n", "\n", " Console.WriteLine(string.Join(\"\",rowItemValues));\n", " }\n", " }\n", "\n", " sqlConnection.Close();\n", " sqlConnection.Dispose();\n", " }\n", "}" ] }, { "cell_type": "markdown", "id": "b0035452", "metadata": {}, "source": [ "### DuckDB" ] }, { "cell_type": "code", "execution_count": 24, "id": "f986fed7", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Id Name Age \n", "1 张三 10 \n", "2 李四 33 \n", "3 王五 66 \n" ] } ], "source": [ "//Ado.Net 操作DuckDB数据库\n", "{\n", " int padRightCount = 15;\n", "\n", " using(var sqlConnection = new DuckDBConnection(SharedDbConnect.DuckDBConnectionString))\n", " {\n", " sqlConnection.Open();\n", " //1、创建表\n", " var createTableSql = \n", " \"\"\"\n", " CREATE TABLE Student \n", " (\n", " Id INTEGER,\n", " Name TEXT,\n", " Age INTEGER\n", " );\n", " \"\"\";\n", "\n", " var createCommand = sqlConnection.CreateCommand();\n", " createCommand.CommandType = CommandType.Text;\n", " createCommand.CommandText = createTableSql;\n", "\n", " var createCount = createCommand.ExecuteNonQuery();\n", " //Console.WriteLine($\"{createCount}\");\n", "\n", " //2、插入示例数据\n", " var insertSql = \n", " \"\"\"\n", " INSERT INTO Student VALUES (1, '张三', 10), (2, '李四', 33), (3, '王五', 66);\n", " \"\"\";\n", "\n", " var insertCommand = sqlConnection.CreateCommand();\n", " insertCommand.CommandType = CommandType.Text;\n", " insertCommand.CommandText = insertSql;\n", "\n", " var insertCount = insertCommand.ExecuteNonQuery();\n", " //Console.WriteLine($\"{insertCount}\");\n", "\n", " //3、查询数据\n", " var querySql = \n", " \"\"\"\n", " SELECT * FROM Student ORDER BY Age\n", " \"\"\";\n", " var queryCommand = sqlConnection.CreateCommand();\n", " queryCommand.CommandType = CommandType.Text;\n", " queryCommand.CommandText = querySql;\n", "\n", " using (var reader = await queryCommand.ExecuteReaderAsync())\n", " {\n", " //输出列名\n", " List columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n", " Console.WriteLine(string.Join(\"\", columnNames));\n", "\n", " //循环输出行数据\n", " while (await reader.ReadAsync())\n", " {\n", " List rowItemValues = new List(100);\n", " for(int i=0; i(querySql).Take(2);\n", " var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n", " {\n", " Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n", " WriteIndented = false,\n", " });\n", "\n", " Console.WriteLine(jsonText);\n", " }\n", "}" ] }, { "cell_type": "markdown", "id": "d5daa579", "metadata": {}, "source": [ "### Dapper 操作 MySQL" ] }, { "cell_type": "code", "execution_count": 27, "id": "0cd87012", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[{\"Id\":1,\"Name\":\"江子韬\",\"Age\":28},{\"Id\":2,\"Name\":\"苏震南\",\"Age\":48}]\r\n" ] } ], "source": [ "//Dapper 操作MySQL\n", "{\n", " using(var dbConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString))\n", " {\n", " var querySql = \"SELECT * FROM `Student` LIMIT @top;\";\n", " var students = dbConnection.Query(querySql, new {top=2});\n", "\n", " var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n", " {\n", " Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n", " WriteIndented = false,\n", " });\n", "\n", " Console.WriteLine(jsonText);\n", " }\n", "}" ] }, { "cell_type": "markdown", "id": "bac2b8e0", "metadata": {}, "source": [ "### Dapper 操作 PostgreSQL" ] }, { "cell_type": "code", "execution_count": 28, "id": "7a476608", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[{\"Id\":1,\"Name\":\"邵致远\",\"Age\":62},{\"Id\":3,\"Name\":\"陶震南\",\"Age\":60}]\r\n" ] } ], "source": [ "//Dapper 操作 PSQL\n", "{\n", " using(var dbConnection = new NpgsqlConnection(SharedDbConnect.PSQLConnectionString))\n", " {\n", " var querySql = \"SELECT * FROM \\\"Student\\\" Where \\\"Age\\\" > @Age LIMIT @Top;\";\n", " var students = dbConnection.Query(querySql, new {Age = 50, top = 2});\n", "\n", " var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n", " {\n", " Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n", " WriteIndented = false,\n", " });\n", "\n", " Console.WriteLine(jsonText);\n", " }\n", "}" ] }, { "cell_type": "markdown", "id": "9075b64b", "metadata": {}, "source": [ "## 使用 EF Core" ] }, { "cell_type": "code", "execution_count": 33, "id": "047da44c", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [], "source": [ "//共享\n", "/// \n", "/// SQL Server DbContext\n", "/// \n", "public class StudyDbContext: DbContext\n", "{\n", " public StudyDbContext(DbContextOptions option):base(option)\n", " {\n", "\n", " }\n", "\n", " public DbSet Student {get; set;}\n", "\n", " protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\n", " {\n", " base.OnConfiguring(optionsBuilder);\n", " if(!optionsBuilder.IsConfigured)\n", " {\n", " Console.WriteLine(\"没有设置\");\n", " }\n", " }\n", "}" ] }, { "cell_type": "markdown", "id": "3c61973d", "metadata": {}, "source": [ "### EF Core 操作 SQL Server\n", " " ] }, { "cell_type": "code", "execution_count": 34, "id": "6da513fd", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
indexvalue
0
Submission#17+Student
Id
33
Name
戴嘉伦
Age
99
1
Submission#17+Student
Id
45
Name
曾震南
Age
98
2
Submission#17+Student
Id
55
Name
丁子韬
Age
96
3
Submission#17+Student
Id
65
Name
冯宇宁
Age
99
4
Submission#17+Student
Id
167
Name
严睿
Age
96
5
Submission#17+Student
Id
199
Name
孔秀英
Age
96
6
Submission#17+Student
Id
232
Name
王睿
Age
99
7
Submission#17+Student
Id
305
Name
董子异
Age
99
8
Submission#17+Student
Id
318
Name
许晓明
Age
97
9
Submission#17+Student
Id
329
Name
孟宇宁
Age
99
10
Submission#17+Student
Id
338
Name
陶秀英
Age
99
11
Submission#17+Student
Id
382
Name
袁云熙
Age
99
12
Submission#17+Student
Id
400
Name
戴安琪
Age
96
13
Submission#17+Student
Id
413
Name
尹詩涵
Age
99
14
Submission#17+Student
Id
436
Name
罗岚
Age
96
15
Submission#17+Student
Id
439
Name
陆岚
Age
97
16
Submission#17+Student
Id
444
Name
戴璐
Age
97
17
Submission#17+Student
Id
457
Name
谢岚
Age
99
18
Submission#17+Student
Id
477
Name
卢杰宏
Age
97
19
Submission#17+Student
Id
482
Name
萧杰宏
Age
100
(23 more)
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "{ //EF Core SQL Server\n", " var builder = new DbContextOptionsBuilder();\n", " builder.UseSqlServer(SharedDbConnect.MsSqlConnectionString);\n", "\n", " var dbContext = new StudyDbContext(builder.Options);\n", " var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n", " students.Display();\n", "}" ] }, { "cell_type": "markdown", "id": "c4b85b82", "metadata": {}, "source": [ "### EF Core 查询 MySQL" ] }, { "cell_type": "code", "execution_count": 35, "id": "9d5dc22b", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
indexvalue
0
Submission#17+Student
Id
26
Name
邱璐
Age
98
1
Submission#17+Student
Id
58
Name
曾致远
Age
97
2
Submission#17+Student
Id
59
Name
苏秀英
Age
96
3
Submission#17+Student
Id
80
Name
廖詩涵
Age
97
4
Submission#17+Student
Id
99
Name
顾岚
Age
98
5
Submission#17+Student
Id
148
Name
金震南
Age
99
6
Submission#17+Student
Id
172
Name
武秀英
Age
96
7
Submission#17+Student
Id
246
Name
金云熙
Age
99
8
Submission#17+Student
Id
268
Name
董秀英
Age
96
9
Submission#17+Student
Id
281
Name
梁震南
Age
98
10
Submission#17+Student
Id
313
Name
阎子异
Age
97
11
Submission#17+Student
Id
321
Name
顾嘉伦
Age
96
12
Submission#17+Student
Id
329
Name
钟子韬
Age
96
13
Submission#17+Student
Id
378
Name
叶璐
Age
96
14
Submission#17+Student
Id
394
Name
邹致远
Age
96
15
Submission#17+Student
Id
436
Name
李子异
Age
99
16
Submission#17+Student
Id
480
Name
马晓明
Age
97
17
Submission#17+Student
Id
482
Name
贺睿
Age
96
18
Submission#17+Student
Id
484
Name
朱嘉伦
Age
98
19
Submission#17+Student
Id
548
Name
龚震南
Age
96
(27 more)
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "{ //EF Core MySQL\n", " var builder = new DbContextOptionsBuilder();\n", " builder.UseMySQL(SharedDbConnect.MySQLConnectionString);\n", "\n", " var dbContext = new StudyDbContext(builder.Options);\n", " var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n", " students.Display();\n", "}" ] }, { "cell_type": "markdown", "id": "81d3e14d", "metadata": {}, "source": [ "### EFCore PostgreSQL" ] }, { "cell_type": "code", "execution_count": 36, "id": "42dd5655", "metadata": { "polyglot_notebook": { "kernelName": "csharp" } }, "outputs": [ { "data": { "text/html": [ "
indexvalue
0
Submission#17+Student
Id
11
Name
张子异
Age
98
1
Submission#17+Student
Id
19
Name
范璐
Age
96
2
Submission#17+Student
Id
51
Name
贾震南
Age
99
3
Submission#17+Student
Id
54
Name
董子异
Age
99
4
Submission#17+Student
Id
60
Name
张安琪
Age
98
5
Submission#17+Student
Id
81
Name
郭震南
Age
99
6
Submission#17+Student
Id
86
Name
罗璐
Age
97
7
Submission#17+Student
Id
94
Name
贺睿
Age
97
8
Submission#17+Student
Id
100
Name
钱睿
Age
97
9
Submission#17+Student
Id
164
Name
苏睿
Age
97
10
Submission#17+Student
Id
211
Name
杜睿
Age
98
11
Submission#17+Student
Id
238
Name
孔詩涵
Age
98
12
Submission#17+Student
Id
263
Name
贾子韬
Age
97
13
Submission#17+Student
Id
310
Name
毛震南
Age
96
14
Submission#17+Student
Id
322
Name
方宇宁
Age
97
15
Submission#17+Student
Id
357
Name
尹晓明
Age
99
16
Submission#17+Student
Id
380
Name
张震南
Age
97
17
Submission#17+Student
Id
434
Name
徐子异
Age
99
18
Submission#17+Student
Id
468
Name
姚子异
Age
96
19
Submission#17+Student
Id
524
Name
顾璐
Age
98
(18 more)
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "{ \n", " var builder = new DbContextOptionsBuilder();\n", " builder.UseNpgsql(SharedDbConnect.PSQLConnectionString);\n", "\n", " var dbContext = new StudyDbContext(builder.Options);\n", " var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n", " students.Display();\n", "}" ] } ], "metadata": { "kernelspec": { "display_name": ".NET (C#)", "language": "C#", "name": ".net-csharp" }, "polyglot_notebook": { "kernelInfo": { "defaultKernelName": "csharp", "items": [ { "aliases": [], "languageName": "csharp", "name": "csharp" } ] } } }, "nbformat": 4, "nbformat_minor": 5 }