日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
秀啊,用Python快速開發(fā)在線數(shù)據(jù)庫更新修改工具

 1 簡介

這是我的系列教程「Python+Dash快速web應(yīng)用開發(fā)」的第十三期,在上一期中,我們一起認識了Dash自帶的交互式表格組件dash_table,并學(xué)會了如何自定義表格中不同部分的樣式。

創(chuàng)新互聯(lián)是專業(yè)的潛江網(wǎng)站建設(shè)公司,潛江接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行潛江網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

而今天的教程,我們將繼續(xù)深入認識dash_table的更多交互方面的功能,學(xué)習(xí)如何為渲染出的表格分頁,并添加動態(tài)內(nèi)容修改等交互功能。

圖1

2 dash_table的基礎(chǔ)交互能力

dash_table的核心功能是賦予用戶與圖表進行快捷交互的能力,下面我們來學(xué)習(xí)其基礎(chǔ)常用的一些交互功能:

2.1 分頁翻頁

當(dāng)我們要展示的數(shù)據(jù)行數(shù)較多時,在網(wǎng)頁中渲染可以選擇分頁,這在dash_table中實現(xiàn)起來比較方便,根據(jù)數(shù)據(jù)傳遞方式的不同,可以分為「前端分頁」與「后端分頁」:

2.1.1 前端分頁

前端分頁顧名思義,就是在我們訪問Dash應(yīng)用時,表格內(nèi)所有頁面的數(shù)據(jù)一次性加載完成,適合數(shù)據(jù)量不大的情況,將數(shù)據(jù)存儲壓力轉(zhuǎn)移到瀏覽器端。

通過參數(shù)page_size設(shè)置每頁要顯示的記錄行數(shù),Dash會自動幫我們分好頁,并配上翻頁部件:

app1.py

 
 
 
 
  1. import dash 
  2. import dash_bootstrap_components as dbc 
  3. import dash_table 
  4.  
  5. import seaborn as sns 
  6.  
  7. df = sns.load_dataset('tips') 
  8. df.insert(0, '#', df.index) 
  9.  
  10. app = dash.Dash(__name__) 
  11.  
  12. app.layout = dbc.Container( 
  13.     [ 
  14.         dash_table.DataTable( 
  15.             id='dash-table', 
  16.             data=df.to_dict('records'), 
  17.             columns=[ 
  18.                 {'name': column, 'id': column} 
  19.                 for column in df.columns 
  20.             ], 
  21.             page_size=15,  # 設(shè)置單頁顯示15行記錄行數(shù) 
  22.             style_header={ 
  23.                 'font-family': 'Times New Romer', 
  24.                 'font-weight': 'bold', 
  25.                 'text-align': 'center' 
  26.             }, 
  27.             style_data={ 
  28.                 'font-family': 'Times New Romer', 
  29.                 'text-align': 'center' 
  30.             } 
  31.         ) 
  32.     ], 
  33.     style={ 
  34.         'margin-top': '50px' 
  35.     } 
  36.  
  37. if __name__ == '__main__': 
  38.     app.run_server(debug=True) 

圖2

2.1.2 后端分頁

雖然前端分頁簡單易用,但當(dāng)我們的數(shù)據(jù)很大時,強行使用前端分頁會給「網(wǎng)絡(luò)傳輸」和「瀏覽器端」帶來不小的延遲和內(nèi)存壓力,嚴重影響用戶體驗,因此Dash貼心地為我們準備了「后端分頁」方式。

這時首先我們得為DataTable設(shè)置參數(shù)page_action='custom',這是使用后端分頁的先決條件,接下來我們需要認識一些新的參數(shù):

page_current,int型,對應(yīng)當(dāng)前翻到的頁碼;

page_count,int型,對應(yīng)顯示的總頁數(shù);

我們在使用「后端分頁」時,實際上就是通過用戶當(dāng)前翻到的頁碼,以及設(shè)定的page_size,來動態(tài)地在翻頁后加載對應(yīng)批次的數(shù)據(jù),并控制顯示的總頁數(shù),參考下面這個簡單的例子:

app2.py

 
 
 
 
  1. import dash 
  2. import dash_bootstrap_components as dbc 
  3. import dash_table 
  4. from dash.dependencies import Input, Output 
  5.  
  6. import seaborn as sns 
  7. import pandas as pd 
  8. from tqdm import tqdm 
  9.  
  10. # 壓力測試 
  11. df = pd.concat([sns.load_dataset('tips') for _ in tqdm(range(1000))], ignore_index=True) 
  12. df.insert(0, '#', df.index) 
  13.  
  14. app = dash.Dash(__name__) 
  15.  
  16. app.layout = dbc.Container( 
  17.     [ 
  18.         dbc.Spinner( 
  19.             dash_table.DataTable( 
  20.                 id='dash-table', 
  21.                 columns=[ 
  22.                     {'name': column, 'id': column} 
  23.                     for column in df.columns 
  24.                 ], 
  25.                 page_size=15,  # 設(shè)置單頁顯示15行記錄行數(shù) 
  26.                 page_action='custom', 
  27.                 page_current=0, 
  28.                 style_header={ 
  29.                     'font-family': 'Times New Romer', 
  30.                     'font-weight': 'bold', 
  31.                     'text-align': 'center' 
  32.                 }, 
  33.                 style_data={ 
  34.                     'font-family': 'Times New Romer', 
  35.                     'text-align': 'center' 
  36.                 } 
  37.             ) 
  38.         ) 
  39.     ], 
  40.     style={ 
  41.         'margin-top': '50px' 
  42.     } 
  43.  
  44.  
  45. @app.callback( 
  46.     [Output('dash-table', 'data'), 
  47.      Output('dash-table', 'page_count')], 
  48.     [Input('dash-table', 'page_current'), 
  49.      Input('dash-table', 'page_size')] 
  50. def refresh_page_data(page_current, page_size): 
  51.     return df.iloc[page_current * page_size:(page_current + 1) * page_size].to_dict('records'), 1 + df.shape[ 
  52.         0] // page_size 
  53.  
  54.  
  55. if __name__ == '__main__': 
  56.     app.run_server(debug=True) 

可以看到,即使我們完整的數(shù)據(jù)集被我concat到24萬行,加載應(yīng)用以及網(wǎng)頁內(nèi)翻頁時依然輕松自如毫無壓力,在實際應(yīng)用中你還可以將翻頁部分改成受到LIMIT與OFFSET控制的數(shù)據(jù)庫查詢過程,使得應(yīng)用運行的更加快速高效:

圖3

2.2 對單元格內(nèi)容進行編輯

講完了分頁翻頁,接下來我們來學(xué)習(xí)dash_table中更加強大的功能——單元格內(nèi)容編輯。

一個現(xiàn)代化的web應(yīng)用當(dāng)然不能局限于僅僅查看數(shù)據(jù)這么簡單,Dash同樣賦予了我們雙擊數(shù)據(jù)表單元格進行數(shù)據(jù)編輯的能力,首先得設(shè)置參數(shù)editable=True,即開啟表格編輯模式,接下來就可以對數(shù)據(jù)區(qū)域單元格進行任意的雙擊選中編輯。

不過Dash默認的單元格被選中的樣式忒丑了(是粉色的你敢信),因此我們可以利用下面的參數(shù)設(shè)置方式來自定義美化:

 
 
 
 
  1. style_data_conditional=[ 
  2.                 { 
  3.                     # 對選中狀態(tài)下的單元格進行自定義樣式 
  4.                     "if": {"state": "selected"}, 
  5.                     "background-color": "#b3e5fc", 
  6.                     "border": "none" 
  7.                 }, 
  8.             ] 

來看一個形象的例子,我們對「前端分頁」方式渲染出的表格進行隨意的修改,并在下方對利用pandas的compare比較出的數(shù)據(jù)框之間的差異結(jié)果進行打印:

app3.py

 
 
 
 
  1. import dash 
  2. import dash_html_components as html 
  3. import dash_core_components as dcc 
  4. import dash_bootstrap_components as dbc 
  5. import dash_table 
  6. from dash.dependencies import Input, Output 
  7.  
  8. import seaborn as sns 
  9. import pandas as pd 
  10.  
  11. df = sns.load_dataset('tips') 
  12. df.insert(0, '#', df.index) 
  13.  
  14. app = dash.Dash(__name__) 
  15.  
  16. app.layout = dbc.Container( 
  17.     [ 
  18.         dash_table.DataTable( 
  19.             id='dash-table', 
  20.             data=df.to_dict('records'), 
  21.             columns=[ 
  22.                 {'name': column, 'id': column} 
  23.                 for column in df.columns 
  24.             ], 
  25.             fixed_rows={'headers': True}, 
  26.             page_size=15, 
  27.             editable=True, 
  28.             style_header={ 
  29.                 'font-family': 'Times New Romer', 
  30.                 'font-weight': 'bold', 
  31.                 'text-align': 'center' 
  32.             }, 
  33.             style_data={ 
  34.                 'font-family': 'Times New Romer', 
  35.                 'text-align': 'center' 
  36.             }, 
  37.             style_data_conditional=[ 
  38.                 { 
  39.                     # 對選中狀態(tài)下的單元格進行自定義樣式 
  40.                     "if": {"state": "selected"}, 
  41.                     "background-color": "#b3e5fc", 
  42.                     "border": "none" 
  43.                 }, 
  44.             ] 
  45.         ), 
  46.         html.H4('與原表格內(nèi)容比較:', style={'margin-top': '50px'}), 
  47.         dcc.Markdown( 
  48.             '無差別', 
  49.             id='markdown', 
  50.             dangerously_allow_html=True 
  51.         ) 
  52.     ], 
  53.     style={ 
  54.         'margin-top': '50px' 
  55.     } 
  56.  
  57.  
  58. @app.callback( 
  59.     Output('markdown', 'children'), 
  60.     Input('dash-table', 'data'), 
  61.     prevent_initial_call=True 
  62. def compare_difference(dash_table_data): 
  63.     print(pd.DataFrame(dash_table_data)) 
  64.  
  65.     return df.compare(pd.DataFrame(dash_table_data)).to_html() 
  66.  
  67.  
  68. if __name__ == '__main__': 
  69.     app.run_server(debug=True) 

可以看到,我們成功地對指定單元格元素進行了修改。

圖4

3 開發(fā)數(shù)據(jù)庫內(nèi)容在線更新工具

在學(xué)習(xí)完今天的內(nèi)容之后,我們就可以開發(fā)一個簡單的,可在線自由修改并同步變動到數(shù)據(jù)庫的小工具,這里我們以MySQL數(shù)據(jù)庫為例,對示例表進行修改和更新:

首先我們利用下列代碼向示例數(shù)據(jù)庫中新建表格tips:

 
 
 
 
  1. from sqlalchemy import create_engine 
  2. import seaborn as sns 
  3.  
  4. df = sns.load_dataset('tips') 
  5. df.insert(0, '#', df.index) 
  6.  
  7. engine = create_engine('mysql+pymysql://root:mysql@localhost/DASH') 
  8.  
  9. df.to_sql('tips', con=engine, if_exists='replace', index=False) 

圖5

接下來我們就以創(chuàng)建好的tips表為例,開發(fā)一個Dash應(yīng)用,進行數(shù)據(jù)的修改和更新到數(shù)據(jù)庫:

圖6

效果非常的不錯,你可以在我這個簡單示例的基礎(chǔ)上,拓展更多新功能,也可以采取后端分頁+條件修改的方式來應(yīng)對大型數(shù)據(jù)表的修改,全部代碼如下:

app4.py

 
 
 
 
  1. import dash 
  2. import dash_bootstrap_components as dbc 
  3. import dash_core_components as dcc 
  4. import dash_html_components as html 
  5. import dash_table 
  6. from dash.dependencies import Input, Output, State 
  7.  
  8. from sqlalchemy import create_engine 
  9. import pandas as pd 
  10.  
  11. engine = create_engine('mysql+pymysql://root:mysql@localhost/DASH') 
  12.  
  13. app = dash.Dash(__name__) 
  14.  
  15. app.layout = dbc.Container( 
  16.     [ 
  17.         dbc.Row( 
  18.             [ 
  19.                 dbc.Col(dbc.Button('更新數(shù)據(jù)表', id='refresh-tables', style={'width': '100%'}), width=2), 
  20.                 dbc.Col(dcc.Dropdown(id='table-select', style={'width': '100%'}), width=2) 
  21.             ] 
  22.         ), 
  23.         html.Hr(), 
  24.         dash_table.DataTable( 
  25.             id='dash-table', 
  26.             editable=True, 
  27.             page_size=15, 
  28.             style_header={ 
  29.                 'font-family': 'Times New Romer', 
  30.                 'font-weight': 'bold', 
  31.                 'text-align': 'center' 
  32.             }, 
  33.             style_data={ 
  34.                 'font-family': 'Times New Romer', 
  35.                 'text-align': 'center' 
  36.             }, 
  37.             style_data_conditional=[ 
  38.                 { 
  39.                     # 對選中狀態(tài)下的單元格進行自定義樣式 
  40.                     "if": {"state": "selected"}, 
  41.                     "background-color": "#b3e5fc", 
  42.                     "border": "none" 
  43.                 }, 
  44.             ] 
  45.         ), 
  46.         dbc.Button('同步變動到數(shù)據(jù)庫', id='update-tables', style={'display': 'none'}), 
  47.         html.P(id='message') 
  48.     ], 
  49.     style={ 
  50.         'margin-top': '50px' 
  51.     } 
  52.  
  53.  
  54. @app.callback( 
  55.     Output('table-select', 'options'), 
  56.     Input('refresh-tables', 'n_clicks') 
  57. def refresh_tables(n_clicks): 
  58.     if n_clicks: 
  59.         return [ 
  60.             { 
  61.                 'label': table, 
  62.                 'value': table 
  63.             } 
  64.             for table in pd.read_sql_query('SHOW TABLES', con=engine)['Tables_in_dash'] 
  65.         ] 
  66.  
  67.     return dash.no_update 
  68.  
  69.  
  70. @app.callback( 
  71.     [Output('dash-table', 'data'), 
  72.      Output('dash-table', 'columns'), 
  73.      Output('update-tables', 'style')], 
  74.     Input('table-select', 'value') 
  75. def render_dash_table(value): 
  76.     if value: 
  77.         df = pd.read_sql_table(value, con=engine) 
  78.  
  79.         return df.to_dict('records'), [ 
  80.             {'name': column, 'id': column} 
  81.             for column in df.columns 
  82.         ], {'margin-top': '25px'} 
  83.  
  84.     else: 
  85.         return [], [], {'display': 'none'} 
  86.  
  87.  
  88. @app.callback( 
  89.     [Output('message', 'children'), 
  90.      Output('message', 'style')], 
  91.     Input('update-tables', 'n_clicks'), 
  92.     [State('dash-table', 'data'), 
  93.      State('table-select', 'value')] 
  94. def update_to_database(n_clicks, data, value): 
  95.  
  96.     if n_clicks: 
  97.  
  98.         try: 
  99.             pd.DataFrame(data).to_sql(value, con=engine, if_exists='replace', index=False) 
  100.  
  101.             return '更新成功!', {'color': 'green'} 
  102.         except Exception as e: 
  103.             return f'更新失?。e}', {'color': 'red'} 
  104.  
  105.     return dash.no_update 
  106.  
  107. if __name__ == '__main__': 
  108.     app.run_server(debug=True) 

分享標題:秀啊,用Python快速開發(fā)在線數(shù)據(jù)庫更新修改工具
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/djsijei.html