首页 文章 精选 留言 我的

精选列表

搜索[ORM],共2635篇文章
优秀的个人博客,低调大师

sagacity-sqltoy 睿智 ORM 框架 5.0.7、 4.18.31 版本发布

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装):https://github.com/threefish/sqltoy-idea-plugins 更新内容 1.修复oracle数据库oracle.sql.TIMESTAMP 转LocalDateTime的支持 sqltoy特点介绍: sqltoy最佳sql编写模式,便于开发和后期维护 sqltoy的缓存翻译,大幅减少表关联简化sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast() 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成1.3~1.5次(用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy的分页取总记录的过程不是简单的select count(1) from (原始sql);而是智能判断是否变成:select count(1) from 'from后语句', 并自动剔除最外层的order by sqltoy支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计(含汇总求平均) 便利的跨数据库统计计算:同比环比

优秀的个人博客,低调大师

sagacity-sqltoy 睿智 ORM 框架 5.0.6、4.18.30 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装):https://github.com/threefish/sqltoy-idea-plugins 更新内容 1.优化执行带有缓存翻译的查询,在首次执行时因获取缓存影响当前sql执行后台日志输出问题(建议升级,以免单元测试时产生对日志的困惑)! 感谢网友的反馈,sqltoy及时发版进行修正 sqltoy特点介绍: sqltoy最佳sql编写模式,便于开发和后期维护 sqltoy的缓存翻译,大幅减少表关联简化sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast() 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成1.3~1.5次(用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy的分页取总记录的过程不是简单的select count(1) from (原始sql);而是智能判断是否变成:select count(1) from 'from后语句', 并自动剔除最外层的order by sqltoy支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计(含汇总求平均) 便利的跨数据库统计计算:同比环比

优秀的个人博客,低调大师

sagacity-sqltoy 睿智 ORM 框架 5.0.2、4.18.28 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件(可直接在idea中检索安装):https://github.com/threefish/sqltoy-idea-plugins 更新内容 1. 查询参数findBySql(String sql,Map paramsMap,Class resultType) map支持多层子对象属性 String sql="select * from table where id=:staff.id and name like :staff.name" Map paramMap=new HashMap(); paramsMap.put("staff",new StaffInfo().setId("10000").setName("xxxx")) 2、SqlToyDaoSupport中增加分页Map传参方法: findPageBySql(final Page page, final String sqlOrNamedSql, final Map<String, Object> paramsMap, Class<T> voClass) sqltoy特点介绍: sqltoy最佳sql编写模式,便于开发和后期维护 sqltoy的缓存翻译,大幅减少表关联简化sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast() 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成1.3~1.5次(用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy的分页取总记录的过程不是简单的select count(1) from (原始sql);而是智能判断是否变成:select count(1) from 'from后语句', 并自动剔除最外层的order by sqltoy支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计(含汇总求平均) 便利的跨数据库统计计算:同比环比

优秀的个人博客,低调大师

jSqlBox 4.0.6 版更新,Java 数据库 ORM 工具

jSqlBox是一个Java全功能数据库持久层工具,主页 https://gitee.com/drinkjava2/jsqlbox jSqlBox主要特点是架构优、尺寸小、功能全,基本上所有与数据库操作相关的功能,jSqlBox都已提供。它的主要特点有: 1.内核基于DbUtils并与之兼容。 2.jSqlBox提倡在java里拼写SQL,独创参数内嵌式SQL写法, 任意DAO方法甚至ActiveRecord方法都可以混插SQl片段,例如: new Demo().setName(""张三"").insert().putField("name", "李四").update(" and name=", ques("李四"), " and age> ",ques(20)); 3.单个jar包,无须引入任何第三方库即可实现声明式事务、分库分表和分布式事务 4.ActiveRecord实体类可以只声明接口,不占用宝贵的单继承 5.支持80多种数据库方言的DDL生成、分页、函数变换、实体源码生成 6.在低版本Java里也可以存放并利用IDE定位多行SQL文本 7.学习成本低,实体注解尽量兼容JPA注解,不支持级联、不支持隋性加载 。 jSqlBox的目标是做最好用的数据库持久层工具,正如我喜欢给别的项目找缺点一样,也欢迎大家来找jSqlBox的缺点。 本次更新是最近三次更新的汇总,最新版本为jsqlbox-4.0.6.jre8,有以下内容变更: 1. 从数据库生成Java源码时,char(xx) 类型不再映射成单个Character字符类型, 而是映射成String类型. 2. DB类中增加一个静态iPrepare方法以方便使用。 3. 新增一个SQL工具类,保存了SQL关键字常量,以减少拼写SQL的错误和去除字符引号,如字符" select " 可以用SQL.SELECT代替,例如以下SQL: User u=DB.eLoadBySQL(User.class, "select * from user_tb where user_id=", ques(3), " or user_name=", ques("other")); 如果配合源码自动生成的列名常量,以及静态引入的SQL常量,则可以写成以下支持SQL重构的形式: User u=DB.eLoadBySQL(User.class, SELECT_STAR, FROM, User.TABLE_NAME, WHERE, User.ID, EQ, ques(3), OR, User.NAME, EQ, ques("other")); 这种写法相比与JOOQ之类的SQL工具来说,优点是秒懂、学习负担轻,因为本质上jSqlBox就是在Java里拼接SQL字符串。 4. DbContext和DB类中新增了一个eFindOneBySQL方法,这个方法如果没有发现实体将会返回null, 而不是象eLoadBySQL方法一样抛出异常。 5. StrUtils工具类中增加了一个array方法,用于将数组转换写成("abc", 12, 345)类型的字符串形式。 6. TableModelUtilsOfDb和TableModelUtilsOfJavaSrc中,改成用字符串常量的形式,并有功能调整, 7. 允许使用@Column(name="`xxx`") 的方式使用数据库关键字作为列名,支持反单引号、双引号、中括号三种引用符,视不同的数据库而定。使用数据库关键字作为列名这种做法不推荐,通常只用于旧项目改造,新项目强烈不建议使用关键字作为列名。 8. TypeUtils中更正了实体不支持基本数据类型如int、short等类型的bug 9. 更正了@IdentityId注解在MySql下出错的bug,这是BigInteger类型转换有bug造成的 10. 更正了@Enumerated注解的字段应该允许为null 以上更新内容感谢mr.fire同学提交pr和weishengbin同学提交issue!

优秀的个人博客,低调大师

RedBeanPHP 5.4 beta 1 发布,PHP 的 ORM 映射框架

ReadBeanPHP 支持数据库包括:CUBRID,MySQL, Postgres, SQLite 无需配置。5.4 beta 1 版本已经发布: R::store( $beans,$unfreezeIfNecessary) R::storeAll( $beans,$unfreezeIfNecessary) R::findForUpdate( ) R::traverse(...,function( ,$depth){}) 允许 findLike(以及其他类似的)使用“isnull”条件 trash/trashAll 返回已删除 bean 的编号 修复Facade::removeToolBoxByKey移除工具箱 R::getRow()现在返回类型数组 R::setAllowFluidTransactions() R::diff( ) 的性能改进 修复缓存防止第二个 FOR-UPDATE SQL 查询 附加单元测试 改进源代码文档 详情发布说明: https://redbeanphp.com/index.php?p=/beta

优秀的个人博客,低调大师

Python全栈 Web(Django框架、后台管理,ORM关系)

F查询和Q查询: F() 在之执行中获取某字段的值 F("字段名") 将所有人的年龄加10 form django.db.models import F Author.objects.all().update(age=F("age")+10) def doF_views(request): Author.objects.all().update(age=F('age')+10) return redirect('/07-queryall') Q() 在查询条件中可以完成or操作 Q(条件)|Q(条件) 查询所有id为1或年龄为48的人的信息 form django.db.models import Q Author.objects.filter(Q(id=1)|Q(age=48)) authors = Author.objects.filter(Q(age=30|Q(id__gt=20))) 原生的数据库操作方法: 查询: 函数:raw(sql) Entry.objects.raw(sql) 返回值:QuerySet 增删改: from django.db import connection with connection.cursor() as cursor sql = "delete from ..." cursor.execute(sql) return "" def raw_views(request): sql = "select * from index_author where age>45" authors = Author.objects.raw(sql) for au in authors: print(au.name,au.age,au.email) return HttpResponse("Query OK") 使用后台管理 models 创建后台管理员 ./manage.py createsuperuser username:输入用户名 如果不写默认为系统名称 email Address:电子邮件 Password:密码 Password(agian):重复密码 基本管理: 在应用中的admin.py中注册要管理的数据 1.admin.py 注册需管理的models类 只有在此注册的models类才允许被管理 2.注册models from .models import * admin.site.register(Entry) 通过models类的内部类 meta 来定义展现形式 class Author(models.Model): ... ... class Meta: db_table 指定实体类映射到表的名字 (该属性设置完成后会同步到数据库) verbose_name 定义实体类在admin中现显示的名字(单数) verbose_name_plural 定义实体类在admin中显示的名字(复数) #创建 Author 的实体类 #1.name - 姓名(CharField -> varchar) #2.age - 年龄(IntegerField -> int) #3.email - 电子邮件(EmailField -> varchar) class Author(models.Model): name = models.CharField(max_length=30,verbose_name='姓名') age = models.IntegerField(verbose_name='年龄') email = models.EmailField(null=True,verbose_name='邮件') #表示用户的激活状态:True,表示已激活,False,表示未激活 #由于是新增列,所以必须要给默认值或允许为空 #由于BooleanField默认是不允许为空的,所以此处选择了增加默认值 isActive = models.BooleanField(default=True,verbose_name='激活用户') #增加一个字段,表示用户的头像,可以上传的 picture = models.ImageField(upload_to="static/upload",null=True,verbose_name='头像') # 重写 __str__ ,来定义该对象的字符串表示 def __str__(self): return self.name #增加内部类Meta来定义其展现形式 class Meta: #1.修改表名为author db_table = 'author' #2.指定后台管理时要显示的名字 verbose_name = '作者' verbose_name_plural = verbose_name #3.指定排序规则 ordering = ['-age'] def __repr__(self): return "<Author:%r>" % self.name 高级管理: 在admin.py中创建高级管理类并注册 定义EntryAdmin 类 继承admin.ModelAdmin class AuthorAdmin(admin.ModelAdmin): pass 注册高级管理类 admin.site.register(Entry, EntryAdmin) 允许在EntryAdmin中增加属性 list_display 定义在列表页上显示的字段们 取值: 由属性名组成的元组或列表 list_display_links 定义在列表页也能链接到详情页的字段们 取值: 同上 这里的取值必须要出现在list_display中 list_editable 定义在列表页中允许被修改的字段们 取值: 同上 必须出现在list_display中 但是不能出现在list_display_links中 search_fields 添加允许搜索的字段们 取值 同上 list_filter 列表页的右测增加过滤器 实现快速筛选 date_hierarchy 列表页的顶部增加时间选择器 DateField 或 DateTimeField的列名 fields 在详情页中 指定显示那些字段 并按照什么样式的顺序显示 取值: 由属性名组成的列表或元组 fieldsets 在详情页面中 对字段们进行分组显示的 fieldsets 与 fields不能共存 取值: fieldsets = [ # 分组1 ("分组名称", { "fields":("属性1", "属性2") "classes": ("collapse") }), # 分组2 (), ] from django.contrib import admin from .models import * #声明高级管理类 class AuthorAdmin(admin.ModelAdmin): #指定在列表页中显示的字段们 list_display = ('name','age','email') #指定能够连接到详情页的字段们 list_display_links = ('name','email') #指定在列表页中就允许被修改的字段们 list_editable = ('age',) #指定条件的搜索字段们 search_fields = ('name','email') #指定右侧过滤器 list_filter=('name',) #指定显示的字段以及显示的顺序 # fields = ('name','isActive','email') #指定显示的字段分组 fieldsets = ( #分组1 ('基本信息',{ 'fields':('name','email'), }), #分组2 ('可选信息',{ 'fields':('age','isActive','picture'), 'classes':('collapse',), }) ) class BookAdmin(admin.ModelAdmin): #指定时间选择器 date_hierarchy = "publicate_date" class PublisherAdmin(admin.ModelAdmin): list_display = ('name','address','city','website') list_editable = ('address','city') list_filter = ('address','city') search_fields = ('name','website') fieldsets = ( ('基本选项',{ 'fields':('name','address','city'), }), ( '高级选项',{ 'fields':('country','website'), 'classes':('collapse',) } ) ) # Register your models here. # 注册高级管理类 admin.site.register(Author,AuthorAdmin) admin.site.register(Publisher,PublisherAdmin) admin.site.register(Book,BookAdmin) # 注册普通管理类 admin.site.register(Wife) 关系映射: 一对一的关系映射 语法: 在关联的连个类的任何一个中增加 属性 = models.OneToOneField(Entry) class Author(models.Model): .... class Wife(models.Model); .... # 增加对Author的一对一引用 author = models.OneToOneField(Author) # 在数据库中生成一个外键列在wife表中 要引用自author 表中的主键 # 在Author模型中也会增加一个隐式属性叫wife #引用Author,实现一对一映射 author = models.OneToOneField(Author,verbose_name='相公') 查询: 正向查询: 直接通过关联属性就能获取到关联数据 通过wife找author wife = Wife.objects.get(id=1) author = wife.author 反向查询: 通过反向引用属性查询 通过author找wife author = Author.objects.get(id=1) # 反向引用的属性就是模型类的全小写 wife = author.wife #正向查询 wife = Wife.objects.get(id=1) wife_author = wife.author #反向查询 author = Author.objects.get(id=1) author_wife = author.wife return render(request,'14-oto.html',locals()) 一对多关系映射: 语法: 在"多"的模型中对"一"的模型引用 属性 = models.ForeignKey(Entry) class Publisher(models.Model): .... class Book(models.Model): .... publisher = modelsForeignKey(Publisher) #增加对Publisher的引用(1:M) publisher = models.ForeignKey(Publisher,null=True) 查询: 正向查询: book = Book.objects.get(id=1) publisher = book.publisher 反向查询: django 会默认在publisher中增加book_set属性 来表示对应的所有书籍的查询对象 publisher = Publisher.objects.get(id=1) publisher = publisher.book_set.all() def otm_views(request): # 正向查询:通过Book查询Publisher,在15-otm.html中显示每个book对应的publisher books = Book.objects.all() # 反向查询 pub = Publisher.objects.get(id=1) pub_books = pub.book_set.all() return render(request,'15-otm.html',locals()) 多对多关系映射: 语法: 在关联地 任意一个类中都可以增加 属性 = models.ManyToManyField(Entry) class Author(models.Model): .... class Book(models.Model): .... authors = models.ManyToManyField(Author) #增加对Author的引用(M:N) authors = models.ManyToManyField(Author) 查询: 正向查询; 通过Book查询Author authors 属性只是提供了关联表的查询引用 还需要使用all() values()等方法来获取真实的数据 def mtm_views(request): #正向查询:通过 book 查询 authors book = Book.objects.get(id=1) authors = book.authors.all() #反向查询:通过 author 查询 book author = Author.objects.get(id=2) books = author.book_set.all() return render(request,'16-mtm.html',locals())

优秀的个人博客,低调大师

Android:数据库增删改查、SQLite、ORM、Cursor

1.继承类SQLiteOpenHelper: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class MySQLiteHelper extends SQLiteOpenHelper { //重写构造方法 public MySQLiteHelper(Context context, String name, CursorFactory factory, int version) { super (context, name, factory, version); } //创建表 @Override public void onCreate(SQLiteDatabase db) { db.execSQL( "CREATE TABLE person(personid INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),phone VARCHAR(20))" ); db.execSQL( "CREATE TABLE student(personid INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),phone VARCHAR(20))" ); } //升级表(当Database的Version低于当前new里的Version,直接执行下面方法) @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { int v = newVersion - oldVersion; switch (v) { case 3 : db.execSQL( "ALTER TABLE person ADD salary3 VARCHAR(20)" ); case 2 : db.execSQL( "ALTER TABLE person ADD salary2 VARCHAR(20)" ); case 1 : db.execSQL( "ALTER TABLE person ADD salary1 VARCHAR(20)" ); default : break ; } } } 2.实现增删改查: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 /** * CREATE TABLE person ( personid INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), phone VARCHAR(20) ) DROP TABLE person //删除表 INSERT INTO person(name,phone) VALUES ("rongqin","1598088588") //插入 UPDATE person SET name="Andfeel" WHERE personid=2 //改 ALTER TABLE person ADD salary //增加列 DELETE FROM person WHERE name="Andfeel" //删除 SELECT * FROM person WHERE name="Andfeel" SELECT phone,name FROM person SELECT name,phone FROM person ORDER BY name ASC"//ASC升序 DESC降序 * */ public class MainActivity extends Activity implements OnClickListener { private TextView textView; private MySQLiteHelper mDBHelper; private MySQLiteHelper bHelper; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btn__create_table).setOnClickListener( this ); findViewById(R.id.btn_delete_table).setOnClickListener( this ); findViewById(R.id.btn_alter_table).setOnClickListener( this ); findViewById(R.id.btn_insert).setOnClickListener( this ); findViewById(R.id.btn_delete).setOnClickListener( this ); findViewById(R.id.btn_update).setOnClickListener( this ); findViewById(R.id.btn_select).setOnClickListener( this ); textView = (TextView) findViewById(R.id.textView1); //创建数据库 mDBHelper = new MySQLiteHelper( this , "one.db" , null , 3 ); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true ; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn__create_table: btnCreateTable(); break ; case R.id.btn_delete_table: btnDeleteTable(); break ; case R.id.btn_alter_table: btnAlterTable(); break ; case R.id.btn_insert: btnInsert(); break ; case R.id.btn_delete: btnDelete(); break ; case R.id.btn_update: btnUpdate(); break ; case R.id.btn_select: btnSelect(); break ; default : break ; } } private void btnSelect() //查 { SQLiteDatabase db = mDBHelper.getWritableDatabase(); // Cursor cursor = db.rawQuery("SELECT * FROM person WHERE name = ?", new String[]{"rongqin"}); // cursor.moveToFirst(); Cursor cursor = db.query( "person" , //表名 new String[]{ "phone" , "name" }, //查询的列名 "name=?" , //查询条件 new String[]{ "huangxx" }, //查询参数 null , null , "phone DESC" ); //排序,升序为ASC,降序为DESC boolean hasdata = cursor.moveToFirst(); //游标移到第一行 StringBuilder sb = new StringBuilder(); while (hasdata) //是否有数据 { int columnIndex = cursor.getColumnIndex( "name" ); //得到name的列数 String name = cursor.getString(columnIndex); //得到name这一列的值 int columnIndex2 = cursor.getColumnIndex( "phone" ); String phone = cursor.getString(columnIndex2); sb.append( "name:" ).append(name).append( " phone:" ).append(phone).append( "--" ); hasdata = cursor.moveToNext(); //游标移动到下一行,判断是否有值 } textView.setText(sb.toString()); } private void btnUpdate() //改 { SQLiteDatabase db = mDBHelper.getWritableDatabase(); // db.execSQL("UPDATE person SET phone='0592xxxxxx' WHERE personid=5"); ContentValues values = new ContentValues(); values.put( "name" , "haoyouduo" ); values.put( "phone" , "666666" ); db.update( "person" , values , "personid=?" , new String[]{ "8" }); } private void btnDelete() //删 { SQLiteDatabase db = mDBHelper.getWritableDatabase(); // db.execSQL("DELETE FROM person WHERE name='Andfeel'"); db.delete( "person" , "name = ? and personid = ?" , new String[]{ "haoyouduo" , "5" }); } private void btnInsert() //增 { SQLiteDatabase db = mDBHelper.getWritableDatabase(); // db.execSQL("INSERT INTO person(name,phone) VALUES ('rongqin',1598088588)"); ContentValues values = new ContentValues(); values.put( "name" , "huangxx" ); values.put( "phone" , "158888" ); db.insert( "person" , null , values ); } private void btnAlterTable() //扩展表 { } private void btnDeleteTable() //删除表 { } private void btnCreateTable() //创建表 { } } 其他总结: 1.关闭数据源 1 2 3 4 5 6 7 8 9 10 /** * 关闭数据源 */ public void closeConnection() { if (mDb != null && mDb.isOpen()) mDb.close(); if (mDbHelper != null ) mDbHelper.close(); } 本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1216877,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册