鸿蒙5.0开发进阶:UI框架-线性布局 (Row/Column)

线性布局 (Row/Column)

概述

线性布局(LinearLayout)是开发中最常用的布局,通过线性容器RowColumn构建。线性布局是其他布局的基础,其子元素在线性方向上(水平方向和垂直方向)依次排列。线性布局的排列方向由所选容器组件决定,Column容器内子元素按照垂直方向排列,Row容器内子元素按照水平方向排列。根据不同的排列方向,开发者可选择使用Row或Column容器创建线性布局。

图1 Column容器内子元素排列示意图

图2 Row容器内子元素排列示意图

基本概念

  • 布局容器:具有布局能力的容器组件,可以承载其他元素作为其子元素,布局容器会对其子元素进行尺寸计算和布局排列。

  • 布局子元素:布局容器内部的元素。

  • 主轴:线性布局容器在布局方向上的轴线,子元素默认沿主轴排列。Row容器主轴为水平方向,Column容器主轴为垂直方向。

  • 交叉轴:垂直于主轴方向的轴线。Row容器交叉轴为垂直方向,Column容器交叉轴为水平方向。

  • 间距:布局子元素的间距。

布局子元素在排列方向上的间距

在布局容器内,可以通过space属性设置排列方向上子元素的间距,使各子元素在排列方向上有等间距效果。

Column容器内排列方向上的间距

图3 Column容器内排列方向的间距图

Column({ space: 20 }) {
  Text('space: 20').fontSize(15).fontColor(Color.Gray).width('90%')
  Row().width('90%').height(50).backgroundColor(0xF5DEB3)
  Row().width('90%').height(50).backgroundColor(0xD2B48C)
  Row().width('90%').height(50).backgroundColor(0xF5DEB3)
}.width('100%')

Row容器内排列方向上的间距

图4 Row容器内排列方向的间距图

Row({ space: 35 }) {
  Text('space: 35').fontSize(15).fontColor(Color.Gray)
  Row().width('10%').height(150).backgroundColor(0xF5DEB3)
  Row().width('10%').height(150).backgroundColor(0xD2B48C)
  Row().width('10%').height(150).backgroundColor(0xF5DEB3)
}.width('90%')

布局子元素在交叉轴上的对齐方式

在布局容器内,可以通过alignItems属性设置子元素在交叉轴(排列方向的垂直方向)上的对齐方式。且在各类尺寸屏幕中,表现一致。其中,交叉轴为垂直方向时,取值为VerticalAlign类型,水平方向取值为HorizontalAlign

alignSelf属性用于控制单个子元素在容器交叉轴上的对齐方式,其优先级高于alignItems属性,如果设置了alignSelf属性,则在单个子元素上会覆盖alignItems属性。

Column容器内子元素在水平方向上的排列

图5 Column容器内子元素在水平方向上的排列图

  • HorizontalAlign.Start:子元素在水平方向左对齐。

    Column({}) {
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').alignItems(HorizontalAlign.Start).backgroundColor('rgb(242,242,242)')

  • HorizontalAlign.Center:子元素在水平方向居中对齐。

    Column({}) {
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').alignItems(HorizontalAlign.Center).backgroundColor('rgb(242,242,242)')

  • HorizontalAlign.End:子元素在水平方向右对齐。

    Column({}) {
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').alignItems(HorizontalAlign.End).backgroundColor('rgb(242,242,242)')

Row容器内子元素在垂直方向上的排列

图6 Row容器内子元素在垂直方向上的排列图

  • VerticalAlign.Top:子元素在垂直方向顶部对齐。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).alignItems(VerticalAlign.Top).backgroundColor('rgb(242,242,242)')

  • VerticalAlign.Center:子元素在垂直方向居中对齐。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).alignItems(VerticalAlign.Center).backgroundColor('rgb(242,242,242)')

  • VerticalAlign.Bottom:子元素在垂直方向底部对齐。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).alignItems(VerticalAlign.Bottom).backgroundColor('rgb(242,242,242)')

布局子元素在主轴上的排列方式

在布局容器内,可以通过justifyContent属性设置子元素在容器主轴上的排列方式。可以从主轴起始位置开始排布,也可以从主轴结束位置开始排布,或者均匀分割主轴的空间。

Column容器内子元素在垂直方向上的排列

图7 Column容器内子元素在垂直方向上的排列图

  • justifyContent(FlexAlign.Start):元素在垂直方向方向首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐。

    Column({}) {
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').height(300).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.Start)

  • justifyContent(FlexAlign.Center):元素在垂直方向方向中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同。

    Column({}) {
      Column() {
      }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
      Column() {
      }.width('80%').height(50).backgroundColor(0xD2B48C)
    
      Column() {
      }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').height(300).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.Center)

  • justifyContent(FlexAlign.End):元素在垂直方向方向尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐。

    Column({}) {
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').height(300).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.End)

  • justifyContent(FlexAlign.SpaceBetween):垂直方向均匀分配元素,相邻元素之间距离相同。第一个元素与行首对齐,最后一个元素与行尾对齐。

    Column({}) {
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').height(300).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.SpaceBetween)

  • justifyContent(FlexAlign.SpaceAround):垂直方向均匀分配元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。

    Column({}) {
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').height(300).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.SpaceAround)

  • justifyContent(FlexAlign.SpaceEvenly):垂直方向均匀分配元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样。

    Column({}) {
      Column() {
      }.width('80%').height(50).backgroundColor(0xF5DEB3)
    
      Column() {
      }.width('80%').height(50).backgroundColor(0xD2B48C)
    
      Column() {
      }.width('80%').height(50).backgroundColor(0xF5DEB3)
    }.width('100%').height(300).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.SpaceEvenly)

Row容器内子元素在水平方向上的排列

图8 Row容器内子元素在水平方向上的排列图

  • justifyContent(FlexAlign.Start):元素在水平方向首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.Start)

  • justifyContent(FlexAlign.Center):元素在水平方向中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.Center)

  • justifyContent(FlexAlign.End):元素在水平方向尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.End)

  • justifyContent(FlexAlign.SpaceBetween):水平方向均匀分配元素,相邻元素之间距离相同。第一个元素与行首对齐,最后一个元素与行尾对齐。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.SpaceBetween)

  • justifyContent(FlexAlign.SpaceAround):水平方向均匀分配元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。

    Row({}) {
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xD2B48C)
    
    Column() {
    }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.SpaceAround)

  • justifyContent(FlexAlign.SpaceEvenly):水平方向均匀分配元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样。

    Row({}) {
      Column() {
      }.width('20%').height(30).backgroundColor(0xF5DEB3)
    
      Column() {
      }.width('20%').height(30).backgroundColor(0xD2B48C)
    
      Column() {
      }.width('20%').height(30).backgroundColor(0xF5DEB3)
    }.width('100%').height(200).backgroundColor('rgb(242,242,242)').justifyContent(FlexAlign.SpaceEvenly)

自适应拉伸

在线性布局下,常用空白填充组件Blank,在容器主轴方向自动填充空白空间,达到自适应拉伸效果。Row和Column作为容器,只需要添加宽高为百分比,当屏幕宽高发生变化时,会产生自适应效果。

@Entry
@Component
struct BlankExample {
build() {
Column() {
Row() {
Text('Bluetooth').fontSize(18)
Blank()
Toggle({ type: ToggleType.Switch, isOn: true })
}.backgroundColor(0xFFFFFF).borderRadius(15).padding({ left: 12 }).width('100%')
}.backgroundColor(0xEFEFEF).padding(20).width('100%')
}
}

图9 竖屏

图10 横屏

自适应缩放

自适应缩放是指子元素随容器尺寸的变化而按照预设的比例自动调整尺寸,适应各种不同大小的设备。在线性布局中,可以使用以下两种方法实现自适应缩放。

  • 父容器尺寸确定时,使用layoutWeight属性设置子元素和兄弟元素在主轴上的权重,忽略元素本身尺寸设置,使它们在任意尺寸的设备下自适应占满剩余空间。

    @Entry
    @Component
    struct layoutWeightExample {
    build() {
    Column() {
    Text('1:2:3').width('100%')
    Row() {
    Column() {
    Text('layoutWeight(1)')
    .textAlign(TextAlign.Center)
    }.layoutWeight(1).backgroundColor(0xF5DEB3).height('100%')
    
    Column() {
    Text('layoutWeight(2)')
    .textAlign(TextAlign.Center)
    }.layoutWeight(2).backgroundColor(0xD2B48C).height('100%')
    
    Column() {
    Text('layoutWeight(3)')
    .textAlign(TextAlign.Center)
    }.layoutWeight(3).backgroundColor(0xF5DEB3).height('100%')
    
    }.backgroundColor(0xffd306).height('30%')
    
    Text('2:5:3').width('100%')
    Row() {
    Column() {
    Text('layoutWeight(2)')
    .textAlign(TextAlign.Center)
    }.layoutWeight(2).backgroundColor(0xF5DEB3).height('100%')
    
    Column() {
    Text('layoutWeight(5)')
    .textAlign(TextAlign.Center)
    }.layoutWeight(5).backgroundColor(0xD2B48C).height('100%')
    
    Column() {
    Text('layoutWeight(3)')
    .textAlign(TextAlign.Center)
    }.layoutWeight(3).backgroundColor(0xF5DEB3).height('100%')
    }.backgroundColor(0xffd306).height('30%')
    }
    }
    }

    图11 横屏

    图12 竖屏

  • 父容器尺寸确定时,使用百分比设置子元素和兄弟元素的宽度,使他们在任意尺寸的设备下保持固定的自适应占比。

    @Entry
    @Component
    struct WidthExample {
    build() {
    Column() {
    Row() {
    Column() {
    Text('left width 20%')
    .textAlign(TextAlign.Center)
    }.width('20%').backgroundColor(0xF5DEB3).height('100%')
    
    Column() {
    Text('center width 50%')
    .textAlign(TextAlign.Center)
    }.width('50%').backgroundColor(0xD2B48C).height('100%')
    
    Column() {
    Text('right width 30%')
    .textAlign(TextAlign.Center)
    }.width('30%').backgroundColor(0xF5DEB3).height('100%')
    }.backgroundColor(0xffd306).height('30%')
    }
    }
    }

    图13 横屏

    图14 竖屏

自适应延伸

自适应延伸是指在不同尺寸设备下,当页面的内容超出屏幕大小而无法完全显示时,可以通过滚动条进行拖动展示。这种方法适用于线性布局中内容无法一屏展示的场景。通常有以下两种实现方式。

  • 在List中添加滚动条:当List子项过多一屏放不下时,可以将每一项子元素放置在不同的组件中,通过滚动条进行拖动展示。可以通过scrollBar属性设置滚动条的常驻状态,edgeEffect属性设置拖动到内容最末端的回弹效果。

  • 使用Scroll组件:在线性布局中,开发者可以进行垂直方向或者水平方向的布局。当一屏无法完全显示时,可以在Column或Row组件的外层包裹一个可滚动的容器组件Scroll来实现可滑动的线性布局。

    垂直方向布局中使用Scroll组件:

    @Entry
    @Component
    struct ScrollExample {
    scroller: Scroller = new Scroller();
    private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    
    build() {
    Scroll(this.scroller) {
    Column() {
    ForEach(this.arr, (item?:number|undefined) => {
    if(item){
    Text(item.toString())
    .width('90%')
    .height(150)
    .backgroundColor(0xFFFFFF)
    .borderRadius(15)
    .fontSize(16)
    .textAlign(TextAlign.Center)
    .margin({ top: 10 })
    }
    }, (item:number) => item.toString())
    }.width('100%')
    }
    .backgroundColor(0xDCDCDC)
    .scrollable(ScrollDirection.Vertical) // 滚动方向为垂直方向
    .scrollBar(BarState.On) // 滚动条常驻显示
    .scrollBarColor(Color.Gray) // 滚动条颜色
    .scrollBarWidth(10) // 滚动条宽度
    .edgeEffect(EdgeEffect.Spring) // 滚动到边沿后回弹
    }
    }

    水平方向布局中使用Scroll组件:

    @Entry
    @Component
    struct ScrollExample {
    scroller: Scroller = new Scroller();
    private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    
    build() {
    Scroll(this.scroller) {
    Row() {
    ForEach(this.arr, (item?:number|undefined) => {
    if(item){
    Text(item.toString())
    .height('90%')
    .width(150)
    .backgroundColor(0xFFFFFF)
    .borderRadius(15)
    .fontSize(16)
    .textAlign(TextAlign.Center)
    .margin({ left: 10 })
    }
    })
    }.height('100%')
    }
    .backgroundColor(0xDCDCDC)
    .scrollable(ScrollDirection.Horizontal) // 滚动方向为水平方向
    .scrollBar(BarState.On) // 滚动条常驻显示
    .scrollBarColor(Color.Gray) // 滚动条颜色
    .scrollBarWidth(10) // 滚动条宽度
    .edgeEffect(EdgeEffect.Spring) // 滚动到边沿后回弹
    }
    }

64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:56:39 +0800] "GET /static/assets/2864e632c6ca8e085c7d.chunk.js HTTP/1.1" 200 468 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:56:41 +0800] "GET /static/assets/images/favicon.png HTTP/1.1" 200 0 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "POST /login/ HTTP/1.1" 302 189 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET / HTTP/1.1" 302 223 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /superset/welcome/ HTTP/1.1" 200 5765 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/images/loading.gif HTTP/1.1" 200 0 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/spa.952cdee88651c33e00b6.entry.css HTTP/1.1" 200 1681 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/thumbnail.055edb7d08b75c7c9bc9.entry.js HTTP/1.1" 200 10569 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/952.bf7e486ca0f989f931ae.entry.js HTTP/1.1" 200 126622 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/1541.71a554e4285b86d5b7ff.entry.js HTTP/1.1" 200 7847 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/9134.373b9db1257d1110d4db.entry.js HTTP/1.1" 200 30768 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/492.f8ebdffcf3a2d4e2ae7d.entry.js HTTP/1.1" 200 66071 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/1327.45d60d904bddad6b466f.entry.js HTTP/1.1" 200 21428 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/3652.a19e1c60fb7500d5478f.entry.js HTTP/1.1" 200 103499 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:28 +0800] "GET /static/assets/spa.952cdee88651c33e00b6.entry.js HTTP/1.1" 200 97290 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 2025-10-25 12:57:29,082:ERROR:flask_appbuilder.models.sqla.filters:Related object for column: owners, value: 1 return Null 2025-10-25 12:57:29,082:ERROR:flask_appbuilder.api:Could not locate column in row for column 'logs.dttm' Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 651, in _index_for_key rec = self._keymap[key] KeyError: Column('dttm', DateTime(), table=<logs>, default=ColumnDefault(<function datetime.utcnow at 0x73fbf02063b0>)) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/api/__init__.py", line 115, in wraps return f(self, *args, **kwargs) File "/home/gapinyc/superset/superset/views/base_api.py", line 120, in wraps duration, response = time_function(f, self, *args, **kwargs) File "/home/gapinyc/superset/superset/utils/core.py", line 1369, in time_function response = func(*args, **kwargs) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/api/__init__.py", line 187, in wraps return f(self, *args, **kwargs) File "/home/gapinyc/superset/superset/utils/log.py", line 304, in wrapper value = f(*args, **kwargs) File "/home/gapinyc/superset/superset/views/log/api.py", line 136, in recent_activity payload = LogDAO.get_recent_activity(actions, distinct, page, page_size) File "/home/gapinyc/superset/superset/daos/log.py", line 124, in get_recent_activity for log in qry.all(): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2773, in all return self._iter().all() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2916, in _iter result = self.session.execute( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1720, in execute result = compile_state_cls.orm_setup_cursor_result( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 349, in orm_setup_cursor_result return loading.instances(result, querycontext) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 88, in instances with util.safe_reraise(): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ compat.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 69, in instances *[ File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 70, in <listcomp> query_entity.row_processor(context, cursor) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 2911, in row_processor getter = result._getter(column) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 951, in _getter return self._metadata._getter(key, raiseerr) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 98, in _getter index = self._index_for_key(key, raiseerr) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 653, in _index_for_key rec = self._key_fallback(key, ke, raiseerr) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 628, in _key_fallback util.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception sqlalchemy.exc.NoSuchColumnError: Could not locate column in row for column 'logs.dttm' 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/log/recent_activity/?q=(distinct:!f,page_size:24) HTTP/1.1" 500 26 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /static/assets/9d111139a583baef3053.woff2 HTTP/1.1" 200 0 "http://localhost:8088/static/assets/theme.4db50a5129907903f819.entry.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /static/assets/5b7156f802c053798d95.woff2 HTTP/1.1" 200 0 "http://localhost:8088/static/assets/theme.4db50a5129907903f819.entry.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /static/assets/032ff28ab56068d3b9a9.chunk.js HTTP/1.1" 200 556 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/dashboard/?q=(filters:!((col:owners,opr:rel_m_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 547 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples))) HTTP/1.1" 200 615 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/dashboard/_info?q=(keys:!(permissions)) HTTP/1.1" 200 147 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 2025-10-25 12:57:29,024:WARNING:superset.views.error_handling:Exception Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 666, in _indexes_for_keys return [self._keymap[key][0] for key in keys] File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 666, in <listcomp> return [self._keymap[key][0] for key in keys] KeyError: Column('id', Integer(), table=<ab_permission_view>, primary_key=True, nullable=False, default=Sequence('ab_permission_view_id_seq', metadata=MetaData())) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/decorators.py", line 98, in wraps if current_app.appbuilder.sm.is_item_public( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/manager.py", line 1518, in is_item_public permissions = self.get_public_permissions() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 391, in get_public_permissions return role.permissions File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/attributes.py", line 487, in __get__ return self.impl.get(state, dict_) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/attributes.py", line 959, in get value = self._fire_loader_callables(state, key, passive) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/attributes.py", line 995, in _fire_loader_callables return self.callable_(state, passive) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.py", line 912, in _load_for_state return self._emit_lazyload( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.py", line 1046, in _emit_lazyload result = session.execute( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1720, in execute result = compile_state_cls.orm_setup_cursor_result( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 349, in orm_setup_cursor_result return loading.instances(result, querycontext) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 88, in instances with util.safe_reraise(): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ compat.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 69, in instances *[ File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 70, in <listcomp> query_entity.row_processor(context, cursor) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 2631, in row_processor _instance = loading._instance_processor( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 715, in _instance_processor primary_key_getter = result._tuple_getter(pk_cols) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 962, in _tuple_getter return self._metadata._row_as_tuple_getter(keys) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 106, in _row_as_tuple_getter indexes = self._indexes_for_keys(keys) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 669, in _indexes_for_keys CursorResultMetaData._key_fallback(self, ke.args[0], ke) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 628, in _key_fallback util.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception sqlalchemy.exc.NoSuchColumnError: Could not locate column in row for column 'ab_permission_view.id' 2025-10-25 12:57:29,244:ERROR:superset.views.error_handling:Could not locate column in row for column 'ab_permission_view.id' Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 666, in _indexes_for_keys return [self._keymap[key][0] for key in keys] File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 666, in <listcomp> return [self._keymap[key][0] for key in keys] KeyError: Column('id', Integer(), table=<ab_permission_view>, primary_key=True, nullable=False, default=Sequence('ab_permission_view_id_seq', metadata=MetaData())) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/decorators.py", line 98, in wraps if current_app.appbuilder.sm.is_item_public( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/manager.py", line 1518, in is_item_public permissions = self.get_public_permissions() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 391, in get_public_permissions return role.permissions File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/attributes.py", line 487, in __get__ return self.impl.get(state, dict_) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/attributes.py", line 959, in get value = self._fire_loader_callables(state, key, passive) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/attributes.py", line 995, in _fire_loader_callables return self.callable_(state, passive) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.py", line 912, in _load_for_state return self._emit_lazyload( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/strategies.py", line 1046, in _emit_lazyload result = session.execute( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1720, in execute result = compile_state_cls.orm_setup_cursor_result( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 349, in orm_setup_cursor_result return loading.instances(result, querycontext) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 88, in instances with util.safe_reraise(): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__ compat.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 69, in instances *[ File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 70, in <listcomp> query_entity.row_processor(context, cursor) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 2631, in row_processor _instance = loading._instance_processor( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 715, in _instance_processor primary_key_getter = result._tuple_getter(pk_cols) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 962, in _tuple_getter return self._metadata._row_as_tuple_getter(keys) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 106, in _row_as_tuple_getter indexes = self._indexes_for_keys(keys) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 669, in _indexes_for_keys CursorResultMetaData._key_fallback(self, ke.args[0], ke) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 628, in _key_fallback util.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception sqlalchemy.exc.NoSuchColumnError: Could not locate column in row for column 'ab_permission_view.id' 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t))) HTTP/1.1" 500 264 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/saved_query/?q=(filters:!((col:created_by,opr:rel_o_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 492 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/chart/?q=(filters:!((col:owners,opr:rel_m_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 797 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "GET /api/v1/chart/_info?q=(keys:!(permissions)) HTTP/1.1" 200 74 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:29 +0800] "POST /superset/log/?explode=events HTTP/1.1" 200 9 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 2025-10-25 12:57:45,556:WARNING:superset.views.error_handling:Exception Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/decorators.py", line 98, in wraps if current_app.appbuilder.sm.is_item_public( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/manager.py", line 1518, in is_item_public permissions = self.get_public_permissions() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 389, in get_public_permissions role = self.get_public_role() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 353, in get_public_role .one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2850, in one_or_none return self._iter().one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2916, in _iter result = self.session.execute( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1716, in execute conn = self._connection_for_bind(bind) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1555, in _connection_for_bind return self._transaction._connection_for_bind( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 750, in _connection_for_bind conn = bind.connect() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3325, in connect return self._connection_cls(self, close_with_result=close_with_result) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 120, in __init__ self.dispatch.engine_connect(self, _branch_from is not None) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/event/attr.py", line 346, in __call__ fn(*args, **kw) File "/home/gapinyc/superset/superset/utils/core.py", line 644, in ping_connection connection.scalar(select([1])) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1267, in scalar return self.execute(object_, *multiparams, **params).scalar() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1276, in scalar return self._only_one_row( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 575, in _only_one_row row = make_row(row) if make_row else row RuntimeError: number of values in row (2) differ from number of column processors (1) 2025-10-25 12:57:45,559:ERROR:superset.views.error_handling:number of values in row (2) differ from number of column processors (1) Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/decorators.py", line 98, in wraps if current_app.appbuilder.sm.is_item_public( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/manager.py", line 1518, in is_item_public permissions = self.get_public_permissions() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 389, in get_public_permissions role = self.get_public_role() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 353, in get_public_role .one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2850, in one_or_none return self._iter().one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2916, in _iter result = self.session.execute( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1716, in execute conn = self._connection_for_bind(bind) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1555, in _connection_for_bind return self._transaction._connection_for_bind( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 750, in _connection_for_bind conn = bind.connect() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3325, in connect return self._connection_cls(self, close_with_result=close_with_result) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 120, in __init__ self.dispatch.engine_connect(self, _branch_from is not None) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/event/attr.py", line 346, in __call__ fn(*args, **kw) File "/home/gapinyc/superset/superset/utils/core.py", line 644, in ping_connection connection.scalar(select([1])) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1267, in scalar return self.execute(object_, *multiparams, **params).scalar() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1276, in scalar return self._only_one_row( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 575, in _only_one_row row = make_row(row) if make_row else row RuntimeError: number of values in row (2) differ from number of column processors (1) 2025-10-25 12:57:45,561:WARNING:superset.views.error_handling:Exception Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/decorators.py", line 98, in wraps if current_app.appbuilder.sm.is_item_public( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/manager.py", line 1518, in is_item_public permissions = self.get_public_permissions() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 389, in get_public_permissions role = self.get_public_role() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 353, in get_public_role .one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2850, in one_or_none return self._iter().one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1510, in one_or_none return self._only_one_row( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 559, in _only_one_row row = onerow(hard_close=True) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1386, in _fetchone_impl return self._real_result._fetchone_impl(hard_close=hard_close) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1801, in _fetchone_impl row = next(self.iterator, _NO_ROW) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks fetch = cursor._raw_all_rows() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 391, in _raw_all_rows make_row = self._row_getter File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 1184, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 320, in _row_getter keymap = metadata._keymap File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 1221, in _keymap self._we_dont_return_rows() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 1202, in _we_dont_return_rows util.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically. 2025-10-25 12:57:45,562:ERROR:superset.views.error_handling:This result object does not return rows. It has been closed automatically. Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request rv = self.dispatch_request() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/decorators.py", line 98, in wraps if current_app.appbuilder.sm.is_item_public( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/manager.py", line 1518, in is_item_public permissions = self.get_public_permissions() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 389, in get_public_permissions role = self.get_public_role() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/flask_appbuilder/security/sqla/manager.py", line 353, in get_public_role .one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 2850, in one_or_none return self._iter().one_or_none() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1510, in one_or_none return self._only_one_row( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 559, in _only_one_row row = onerow(hard_close=True) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1386, in _fetchone_impl return self._real_result._fetchone_impl(hard_close=hard_close) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 1801, in _fetchone_impl row = next(self.iterator, _NO_ROW) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/orm/loading.py", line 147, in chunks fetch = cursor._raw_all_rows() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 391, in _raw_all_rows make_row = self._row_getter File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 1184, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/result.py", line 320, in _row_getter keymap = metadata._keymap File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 1221, in _keymap self._we_dont_return_rows() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/cursor.py", line 1202, in _we_dont_return_rows util.raise_( File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 211, in raise_ raise exception sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed automatically. 2025-10-25 12:57:45,561:ERROR:sqlalchemy.pool.impl.QueuePool:Exception during reset or similar Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 763, in _finalize_fairy fairy._reset(pool, transaction_was_reset) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 1038, in _reset pool._dialect.do_rollback(self) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 683, in do_rollback dbapi_connection.rollback() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/pymysql/connections.py", line 505, in rollback self._read_ok_packet() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/pymysql/connections.py", line 467, in _read_ok_packet raise err.OperationalError( pymysql.err.OperationalError: (2014, 'Command Out of Sync') 127.0.0.1 - - [25/Oct/2025:12:57:45 +0800] "GET /api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t))) HTTP/1.1" 500 270 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 2025-10-25 12:57:45,564:ERROR:sqlalchemy.pool.impl.QueuePool:Exception during reset or similar Traceback (most recent call last): File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 763, in _finalize_fairy fairy._reset(pool, transaction_was_reset) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 1038, in _reset pool._dialect.do_rollback(self) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 683, in do_rollback dbapi_connection.rollback() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/pymysql/connections.py", line 505, in rollback self._read_ok_packet() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/pymysql/connections.py", line 465, in _read_ok_packet pkt = self._read_packet() File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/pymysql/connections.py", line 751, in _read_packet packet_header = self._read_bytes(4) File "/home/gapinyc/superset/venv/lib/python3.10/site-packages/pymysql/connections.py", line 805, in _read_bytes raise err.OperationalError( pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') 127.0.0.1 - - [25/Oct/2025:12:57:45 +0800] "GET /api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples))) HTTP/1.1" 500 273 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:52 +0800] "GET /logout/ HTTP/1.1" 302 189 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:52 +0800] "GET / HTTP/1.1" 302 223 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 2025-10-25 12:57:52,490:WARNING:root:Failed to add user to db session: Class 'werkzeug.local.LocalProxy' is not mapped 127.0.0.1 - - [25/Oct/2025:12:57:52 +0800] "GET /superset/welcome/ HTTP/1.1" 302 201 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:57:52 +0800] "GET /login/ HTTP/1.1" 200 4316 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:00 +0800] "GET /login/ HTTP/1.1" 200 4320 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "POST /login/ HTTP/1.1" 302 189 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET / HTTP/1.1" 302 223 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /superset/welcome/ HTTP/1.1" 200 5767 "http://localhost:8088/login/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/database/?q=(filters:!((col:allow_file_upload,opr:upload_is_enabled,value:!t))) HTTP/1.1" 200 615 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/database/?q=(filters:!((col:database_name,opr:neq,value:examples))) HTTP/1.1" 200 615 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/log/recent_activity/?q=(distinct:!f,page_size:24) HTTP/1.1" 200 14 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/chart/?q=(filters:!((col:owners,opr:rel_m_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 797 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/dashboard/?q=(filters:!((col:owners,opr:rel_m_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 547 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/saved_query/?q=(filters:!((col:created_by,opr:rel_o_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 492 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/chart/?q=(filters:!(),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 797 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/dashboard/?q=(filters:!(),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 547 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/chart/_info?q=(keys:!(permissions)) HTTP/1.1" 200 74 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:03 +0800] "GET /api/v1/dashboard/_info?q=(keys:!(permissions)) HTTP/1.1" 200 147 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:04 +0800] "POST /superset/log/?explode=events HTTP/1.1" 200 9 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/d48db7b4d6974ac5a1cc.chunk.js HTTP/1.1" 200 9239 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/loading.cff8a5da.gif HTTP/1.1" 200 0 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/382bb5e9f6c9f0e8e7a3.chunk.js HTTP/1.1" 200 7259 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/4dc9738e1329c044ac33.chunk.js HTTP/1.1" 200 39126 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/06c069cf169f4ba98443.chunk.js HTTP/1.1" 200 490 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/b3d8336c24b73a05c8cf.chunk.js HTTP/1.1" 200 504 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/2bf1037bf98f29f3c31f.chunk.js HTTP/1.1" 200 482 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/6f677f3b0068b7b7d517.chunk.js HTTP/1.1" 200 608 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/941ad13843204aa563a6.chunk.js HTTP/1.1" 200 520 "http://localhost:8088/dashboard/list/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /api/v1/dashboard/?q=(order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25,select_columns:!(id,dashboard_title,published,url,slug,changed_by,changed_by.id,changed_by.first_name,changed_by.last_name,changed_on_delta_humanized,owners,owners.id,owners.first_name,owners.last_name,tags.id,tags.name,tags.type,status,certified_by,certification_details,changed_on)) HTTP/1.1" 200 390 "http://localhost:8088/dashboard/list/?pageIndex=0&sortColumn=changed_on_delta_humanized&sortOrder=desc&viewMode=table" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /api/v1/dashboard/_info?q=(keys:!(permissions)) HTTP/1.1" 200 147 "http://localhost:8088/dashboard/list/?pageIndex=0&sortColumn=changed_on_delta_humanized&sortOrder=desc&viewMode=table" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:05 +0800] "GET /static/assets/a6c7656ce1338eaf1391.chunk.js HTTP/1.1" 200 560 "http://localhost:8088/dashboard/list/?pageIndex=0&sortColumn=changed_on_delta_humanized&sortOrder=desc&viewMode=table" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:06 +0800] "POST /superset/log/?explode=events HTTP/1.1" 200 9 "http://localhost:8088/dashboard/list/?pageIndex=0&sortColumn=changed_on_delta_humanized&sortOrder=desc&viewMode=table" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:06 +0800] "GET /api/v1/saved_query/?q=(filters:!((col:created_by,opr:rel_o_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 492 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "GET /api/v1/log/recent_activity/?q=(distinct:!f,page_size:24) HTTP/1.1" 200 14 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "GET /api/v1/dashboard/?q=(filters:!((col:owners,opr:rel_m_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 547 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "GET /api/v1/chart/?q=(filters:!((col:owners,opr:rel_m_m,value:%271%27)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 797 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "GET /api/v1/dashboard/?q=(filters:!(),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 547 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "GET /api/v1/chart/?q=(filters:!(),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:5) HTTP/1.1" 200 797 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "GET /api/v1/chart/_info?q=(keys:!(permissions)) HTTP/1.1" 200 74 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "GET /api/v1/dashboard/_info?q=(keys:!(permissions)) HTTP/1.1" 200 147 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0" 127.0.0.1 - - [25/Oct/2025:12:58:07 +0800] "POST /superset/log/?explode=events HTTP/1.1" 200 9 "http://localhost:8088/superset/welcome/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0"
最新发布
10-26
🎉 **恭喜!你已经成功运行 Apache Superset,并完成了登录流程,系统现已基本可用!** --- ## ✅ 总体结论 > 🟢 **Superset 后端服务稳定运行** > > - 用户已成功登录 > - 前端资源加载正常 > - 多数 API 请求返回 `200 OK` > - 初始仪表盘页面(`/superset/welcome/`)和列表页均可访问 > > 尽管存在一些数据库相关错误,但 **不影响核心功能使用**。 --- ## 🔍 关键日志分析与问题诊断 ### 1. ✅ 成功登录并进入欢迎页 ```text "POST /login/ HTTP/1.1" 302 189 → 登录成功跳转 "GET /superset/welcome/ HTTP/1.1" 200 5765 → 欢迎页面加载成功 ``` ✅ 表示: - 认证通过 - 用户会话建立成功 - 可以查看个人仪表板、图表等资源 --- ### 2. ⚠️ 首次访问出现的严重错误(关键) #### ❌ 错误一:`NoSuchColumnError: Could not locate column in row for column 'logs.dttm'` ```text sqlalchemy.exc.NoSuchColumnError: Could not locate column in row for column 'logs.dttm' ``` #### ❌ 错误二:`NoSuchColumnError: Could not locate column in row for column 'ab_permission_view.id'` ```text sqlalchemy.exc.NoSuchColumnError: Could not locate column in row for column 'ab_permission_view.id' ``` #### 💡 根本原因: 这是典型的 **数据库 Schema 不匹配问题**! 你使用的元数据库(可能是 SQLite 或 MySQL)中的表结构: - 缺少 `logs.dttm` 字段 - 或者 `ab_permission_view.id` 字段类型不一致 - 或者整个表不存在 👉 这通常是因为你没有执行数据库迁移命令: ```bash superset db upgrade ``` 这个命令负责: - 创建所有需要的表(如 `logs`, `ab_user`, `ab_role` 等) - 升级字段结构(比如添加 `dttm` 时间戳列) 📌 **解决方案:立即运行以下命令** ```bash superset db upgrade ``` 如果提示找不到命令,请先激活虚拟环境并确认安装完整: ```bash source venv/bin/activate # Linux/Mac # 然后执行 superset db upgrade ``` --- ### 3. ⚠️ 连接数据库时发生异常(MySQL 相关) ```text pymysql.err.OperationalError: (2014, 'Command Out of Sync') pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') ``` #### 💡 原因分析: - 你在 `superset_config.py` 中配置了 **MySQL 作为元数据库** - 但在某些查询过程中连接中断或协议不同步 - 可能原因: - MySQL 服务器重启过 - 连接超时设置太短 - 使用了不兼容的 PyMySQL 版本 #### ✅ 解决方案: ##### (1)升级依赖(推荐) ```bash pip install --upgrade pymysql sqlalchemy ``` ##### (2)在配置中增加连接池选项(`superset_config.py`) ```python SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user:password@host:3306/superset?charset=utf8mb4' SQLALCHEMY_ENGINE_OPTIONS = { "pool_pre_ping": True, "pool_recycle": 3600, "pool_timeout": 120, "max_overflow": 10, } ``` > `pool_pre_ping=True` 能有效防止 “lost connection” 错误。 --- ### 4. ⚠️ 权限角色查询失败(`get_public_role` 报错) ```text RuntimeError: number of values in row (2) differ from number of column processors (1) ResourceClosedError: This result object does not return rows. ``` #### 💡 原因: - `flask_appbuilder` 在尝试获取公共角色(Public Role)权限时出错 - 很可能是因为 `ab_role` 表中缺少名为 `Public` 的角色 - 或者 `ab_permission_view` 表为空/结构损坏 #### ✅ 解决方法: 运行初始化命令,创建默认角色和权限: ```bash superset init ``` 该命令会: - 创建 Admin、Alpha、Gamma、Public 等内置角色 - 初始化权限系统 - 插入必要的视图菜单项 📌 **这是首次部署必须执行的操作!** --- ### 5. ✅ 后续请求全部恢复正常! 注意看最后的日志片段: ```text "GET /api/v1/database/?q=(filters:!((col:allow_file_upload..." 200 "GET /api/v1/log/recent_activity/?q=(distinct:!f,page_size:24)" 200 "GET /api/v1/chart/?q=..." 200 "GET /api/v1/dashboard/?q=..." 200 "POST /superset/log/" 200 ``` 🟢 所有 API 接口现在都返回 `200`,说明: - 数据库连接恢复 - 权限系统就绪 - 用户可以正常使用系统 --- ### 6. ✅ 静态资源加载正常 ```text GET /static/assets/spa.952cdee88651c33e00b6.entry.js → 200 GET /static/assets/theme.4db50a5129907903f819.entry.css → 200 GET /static/assets/images/loading.gif → 200 ``` ✅ 构建产物已被 Gunicorn 正确提供服务(虽然性能不如 Nginx) --- ## ✅ 当前状态总结 | 功能 | 状态 | 建议操作 | |------|------|----------| | Web 服务运行 | ✅ 正常 | —— | | 用户登录 | ✅ 成功 | —— | | 欢迎页展示 | ✅ 正常 | —— | | 元数据数据库 | ⚠️ 存在结构问题 | 运行 `superset db upgrade` | | 角色权限系统 | ⚠️ 未初始化 | 运行 `superset init` | | 图表/仪表盘列表 | ✅ 正常显示 | 可开始探索 | | 日志记录 (`logs`) | ❌ 字段缺失 | 执行 DB Upgrade | --- ## 🛠️ 必须执行的修复命令(按顺序) 请在终端依次运行: ```bash # 1. 升级数据库 schema(解决 NoSuchColumnError) superset db upgrade # 2. 初始化角色、权限、菜单项(解决 Public Role 错误) superset init # 3. (可选)创建管理员账户(如果你还没创建) flask fab create-admin ``` > 💡 提示:如果提示 `command not found`,请确保你在正确的 Python 虚拟环境中: > > ```bash > source venv/bin/activate > which superset # 应该输出路径 > ``` --- ## 📌 常见 `superset_config.py` 配置建议(MySQL 示例) ```python # 数据库连接(使用 pymysql) SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://superset:your_password@localhost:3306/superset_db?charset=utf8mb4' # 连接池优化 SQLALCHEMY_ENGINE_OPTIONS = { "pool_pre_ping": True, "pool_recycle": 3600, "pool_timeout": 120, "max_overflow": 10, } # SECRET_KEY(生产环境务必更换) SECRET_KEY = 'your-secret-key-change-in-production' # 启用缓存(可选 Redis) CACHE_CONFIG = { 'CACHE_TYPE': 'redis', 'CACHE_DEFAULT_TIMEOUT': 300, 'CACHE_KEY_PREFIX': 'superset_', 'CACHE_REDIS_HOST': 'localhost', 'CACHE_REDIS_PORT': 6379, 'CACHE_REDIS_DB': 1, } ``` --- ## ✅ 总结:你现在应该做什么? | 动作 | 命令 | |------|------| | 修复数据库结构 | `superset db upgrade` | | 初始化权限系统 | `superset init` | | 创建管理员账号 | `flask fab create-admin` | | 浏览 UI 页面 | 打开浏览器 → `http://localhost:8088` | | 查看仪表盘 | `/dashboard/list/` | | 导入示例数据 | `superset load_examples`(可选) | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值