PythonStock(7):使用 dataTable+Editor+python+Tornado 实现数据通用CRUD
2017-09-28 11:22
736 查看
前言
使用Python开发一个股票项目。项目地址:
https://github.com/pythonstock/stock
相关资料:
http://blog.csdn.net/freewebsys/article/category/7076584
主要使用开发语言是python。
使用的lib库是pandas,tushare,TensorFlow,tornado等。
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78031100未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys
1,使用editor编辑数据
官方demo:https://editor.datatables.net/examples/inline-editing/simple
在股票系统中需要录入自己的股票数据,和一些字典数据表。
对这些数据表进行简单的编辑查看。不用每次都做一个CRUD,进行简单的字典表处理。
利用之前做的数据查询通用的查询显示。
代码已经上传到github上了。
最终效果:
2,增加html代码
editor = new $.fn.dataTable.Editor( { i18n: { create: { button: "新建", title: "创建新数据", submit: "保存" }, edit: { button: "修改", title: "修改数据", submit: "保存" }, remove: { button: "删除", title: "删除数据", submit: "删除", confirm: { _: "确定删除 %d 条数据?", 1: "确定删除 1 条数据?" } }, error: { system: "发生了一系统错误,(更多信息)" }, datetime: { previous: '前一月', next: '下一月', months: [ '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月' ], weekdays: [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六' ] } }, ajax: "/data/editor/save?table_name={{ stockWeb.table_name }}", table: "#dynamic-table", fields: [ {% for index,element in enumerate(stockWeb.columns) %} { label: "{{ stockWeb.column_names[index] }}:", name: "{{ element }}" {% if element == "date" %} ,type: "datetime" {% end %} },{% end %} ] } ); var nameParam = $.getUrlVar('table_name'); //console.log(nameParam); var myTable = $('#dynamic-table').DataTable( { "dom": "Bfrtip", "bFilter": true, "ordering": true, "processing": true, "serverSide": true, "lengthMenu": [[20, 30, 50, 100,1000, -1], [20, 30, 50, 100,1000, "All"]], "language": { "url": "/static/js/datatables.Chinese.json" }, "ajax": "/stock/api_data?type=editor&name="+nameParam, "columns": [ { "data": "", "defaultContent": "", "className": 'select-checkbox', "orderable": true }, {% for column in stockWeb.columns %} { "data": "{{ column }}" }, {% end %} ], select: { style: 'os', selector: 'td:first-child' }, buttons: [ { extend: "create", editor: editor, text: '新增' }, { extend: "edit", editor: editor, text: '编辑' }, { extend: "remove", editor: editor, text: '删除' } ] } );
使用 for index,element in enumerate(stockWeb.columns) 循环将配置数据打印。
Editor 中增加了i18n 的支持,默认的是英文的。
https://editor.datatables.net/examples/simple/i18n.html
同时增加了buttons按钮。有3个按钮,【新增】,【编辑】,【删除】。
在数据的每一列里面增加了一个checkbox,选择数据之后才能进行编辑和删除操作。
而不是像其他操作那样在最后有一个编辑按钮。使用起来不是很直接。
3,后台CRUD
查询操作前面已经实现了,现在开始做的新增,修改,删除操作。# 获得页面数据。 class SaveEditorHandler(webBase.BaseHandler): @gen.coroutine def post(self): action = self.get_argument("action", default=None, strip=False) logging.info(action) table_name = self.get_argument("table_name", default=None, strip=False) stockWeb = stock_web_dic.STOCK_WEB_DATA_MAP[table_name] # 临时map数组。 param_map = {} # 支持多排序。使用shift+鼠标左键。 for item, val in self.request.arguments.items(): # 正则查找 data[1112][code] 里面的code字段 item_key = re.search(r"\]\[(.*?)\]", item) if item_key: tmp_1 = item_key.group() if tmp_1: tmp_1 = tmp_1.replace("][", "").replace("]", "") param_map[tmp_1] = val[0].decode("utf-8") #logging.info(param_map) if action == "create": logging.info("###########################create") # 拼接where 和 update 语句。 tmp_columns = "`, `".join(stockWeb.columns) tmp_values = [] for tmp_key in stockWeb.columns: tmp_values.append(param_map[tmp_key]) # 更新sql。 tmp_values2 = "', '".join(tmp_values) insert_sql = " INSERT INTO %s (`%s`) VALUES('%s'); " % (stockWeb.table_name, tmp_columns, tmp_values2) logging.info(insert_sql) try: self.db.execute(insert_sql) except Exception as e: err = {"error": str(e)} logging.info(err) self.write(err) return elif action == "edit": logging.info("###########################edit") # 拼接where 和 update 语句。 tmp_update = genSql(stockWeb.columns, param_map, ",") tmp_where = genSql(stockWeb.primary_key, param_map, "and") # 更新sql。 update_sql = " UPDATE %s SET %s WHERE %s " % (stockWeb.table_name, tmp_update, tmp_where) logging.info(update_sql) try: self.db.execute(update_sql) except Exception as e: err = {"error": str(e)} logging.info(err) self.write(err) return elif action == "remove": logging.info("###########################remove") # 拼接where 语句。 tmp_where = genSql(stockWeb.primary_key, param_map, "and") # 更新sql。 delete_sql = " DELETE FROM %s WHERE %s " % (stockWeb.table_name, tmp_where) logging.info(delete_sql) try: self.db.execute(delete_sql) except Exception as e: err = {"error": str(e)} logging.info(err) self.write(err) return self.write("{\"data\":[{}]}")
在每一个操作里面都有 一个 action = self.get_argument(“action”, default=None, strip=False) 参数。用来区分3种操作。
要对数据进行sql 的拼接:
生成 INSERT INTO , UPDATE %s SET, DELETE FROM 等sql 语句。
使用self.db.execute 执行sql,并讲异常捕获,返回给前端。
效果:
数据格式是 {“error”: “xxxx error”},datatable 会将错误的信息显示到最下面。
同时还编写了一个工具方法,拼接数据:
# 拼接sql,将value的key 和 value 放到一起。 def genSql(primary_key, param_map, join_string): tmp_sql = "" idx = 0 for tmp_key in primary_key: tmp_val = param_map[tmp_key] if idx == 0: tmp_sql = " `%s` = '%s' " % (tmp_key, tmp_val) else: tmp_sql += join_string + (" `%s` = '%s' " % (tmp_key, tmp_val)) idx += 1 return tmp_sql
可以讲 column 字段组合起来。按照不同字符串进行join。
配置stock_web 字段:
class StockWebData: def __init__(self, mode, type, name, table_name, columns, column_names, primary_key, order_by): self.mode = mode # 模式,query,editor 查询和编辑模式 self.type = type self.name = name self.table_name = table_name self.columns = columns self.column_names = column_names self.primary_key = primary_key self.order_by = order_by if mode == "query": self.url = "/stock/data?table_name=" + self.table_name elif mode == "editor": self.url = "/data/editor?table_name=" + self.table_name .... STOCK_WEB_DATA_LIST.append( StockWebData( mode="editor", type="股票配置管理", name="持仓管理", table_name="user_stock", columns=["code", "date", "price", "shares", "commission_rate", "tax_rate", "comment"], column_names=["股票代码", "日期", "价格", "数量", "佣金", "税率", "备注"], primary_key=["code", "date"], order_by=" code desc " ) )
4,总结
对datatable的研究都差不多了。有增加了数据的crud。可以对字典数据进行CRUD,只需要配置下就可以了,节省了大部分代码。
非常的方便。
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78031100 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys
相关文章推荐
- PythonStock(6):使用 dataTable+python+Tornado 实现服务端多字段查询
- 使用python提取html文件中的特定数据的实现代码
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- Linq中使用反射实现--LINQ通用数据表绑定DataGrid控件的方法(原创)
- 使用Python CGI实现服务器展现数据的API接口
- DataTable用中使用Compute 实现简单的DataTable数据的统计.....
- python+httplib实现HTTP POST提交数据,使用Basic Authentication(基本验证)做登陆验证
- 举例讲解Python的Tornado框架实现数据可视化的教程
- Python使用shelve模块实现简单数据存储的方法
- 使用Python创建MySQL数据库实现字段动态增加以及动态的插入数据
- 纯python实现的web: tornado性能测试以及实际使用解析
- 使用Python的Tornado框架实现一个一对一聊天的程序
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- DataTable用中使用Compute 实现简单的DataTable数据的统计.....
- Asp.net C# 使用Newtonsoft.Json 实现DataTable转Json格式数据
- 举例讲解Python的Tornado框架实现数据可视化的教程
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- Asp.net C# 使用Newtonsoft.Json 实现DataTable转Json格式数据
- DataTable用中使用Compute 实现简单的DataTable数据的统计
- Asp.net C# 使用Newtonsoft.Json 实现DataTable转Json格式数据