pythonjsonfield的简单介绍

发布时间:2023-12-08

pythonjsonfield的简单介绍

更新:<time datetime="2022-11-22 05:08">2022-11-22 05:08</time>

本文目录一览:

  1. 如何用python把protobuf转化json
  2. mysql对json取值路径怎么设置变量
  3. 初学Python照着写了个爬虫不知道错误在哪,怎么改?
  4. Python模块的几种类型简介

如何用python把protobuf转化json

直接利用python提供的json包,在django model的定义中增加一个方法toJSON,利用django model 能访问 _meta.fields 得到相关属性而得到,例子如下:

class Category(models.Model):
    autoid = models.AutoField(primary_key=True)
    email = models.CharField(max_length=150, blank=False)
    comtype = models.CharField(max_length=20, blank=False)
    catname = models.CharField(max_length=150, blank=False)
    def __unicode__(self):
        return '%s' % (self.catname)
    def toJSON(self):
        import json
        return json.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))

然后用django查出数据,并转换成json,代码如下:

row = models.Category.objects.get(autoid=23)
print(row.toJSON())

mysql对json取值路径怎么设置变量

我们知道,JSON是一种轻量级的数据交互的格式,大部分NO SQL数据库的存储都用JSON。MySQL从5.7开始支持JSON格式的数据存储,并且新增了很多JSON相关函数。MySQL 8.0 又带来了一个新的把JSON转换为TABLE的函数JSON_TABLE,实现了JSON到表的转换。

举例一

我们看下简单的例子: 简单定义一个两级JSON 对象:

mysql> set @ytt='{"name":[{"a":"ytt","b":"action"}, {"a":"dble","b":"shard"},{"a":"mysql","b":"oracle"}]}';
Query OK, 0 rows affected (0.00 sec)

第一级:

mysql> select json_keys(@ytt);
+-----------------+
| json_keys(@ytt) |
+-----------------+
| ["name"]        |
+-----------------+
1 row in set (0.00 sec)

第二级:

mysql> select json_keys(@ytt,'$.name[0]');
+-----------------------------+
| json_keys(@ytt,'$.name[0]') |
+-----------------------------+
| ["a", "b"]                  |
+-----------------------------+
1 row in set (0.00 sec)

我们使用MySQL 8.0 的JSON_TABLE来转换 @ytt

mysql> select * from json_table(@ytt,'$.name[*]' columns (f1 varchar(10) path '$.a', f2 varchar(10) path '$.b')) as tt;
+-------+--------+
| f1    | f2     |
+-------+--------+
| ytt   | action |
| dble  | shard  |
| mysql | oracle |
+-------+--------+
3 rows in set (0.00 sec)

举例二

再来一个复杂点的例子,用的是EXPLAIN 的JSON结果集。 JSON 串 @json_str1

set @json_str1 = '{
    "query_block": {
        "select_id": 1,
        "cost_info": {
            "query_cost": "1.00"
        },
        "table": {
            "table_name": "bigtable",
            "access_type": "const",
            "possible_keys": ["id"],
            "key": "id",
            "used_key_parts": ["id"],
            "key_length": "8",
            "ref": ["const"],
            "rows_examined_per_scan": 1,
            "rows_produced_per_join": 1,
            "filtered": "100.00",
            "cost_info": {
                "read_cost": "0.00",
                "eval_cost": "0.20",
                "prefix_cost": "0.00",
                "data_read_per_join": "176"
            },
            "used_columns": ["id", "log_time", "str1", "str2"]
        }
    }
}';

第一级:

mysql> select json_keys(@json_str1) as 'first_object';
+-----------------+
| first_object    |
+-----------------+
| ["query_block"] |
+-----------------+
1 row in set (0.00 sec)

第二级:

mysql> select json_keys(@json_str1,'$.query_block') as 'second_object';
+-------------------------------------+
| second_object                       |
+-------------------------------------+
| ["table", "cost_info", "select_id"] |
+-------------------------------------+
1 row in set (0.00 sec)

第三级:

mysql> select json_keys(@json_str1,'$.query_block.table') as 'third_object'\G
*************************** 1. row ***************************
third_object: ["key","ref","filtered","cost_info","key_length","table_name","access_type","used_columns","possible_keys","used_key_parts","rows_examined_per_scan","rows_produced_per_join"]
1 row in set (0.01 sec)

第四级:

mysql> select json_extract(@json_str1,'$.query_block.table.cost_info') as 'forth_object'\G
*************************** 1. row ***************************
forth_object: {"eval_cost":"0.20","read_cost":"0.00","prefix_cost":"0.00","data_read_per_join":"176"}
1 row in set (0.00 sec)

那我们把这个JSON 串转换为表。

SELECT * FROM JSON_TABLE(@json_str1,
"$.query_block"
COLUMNS(
rowid FOR ORDINALITY,
NESTED PATH '$.table'
COLUMNS (
a1_1 varchar(100) PATH '$.key',
a1_2 varchar(100) PATH '$.ref[0]',
a1_3 varchar(100) PATH '$.filtered',
nested path '$.cost_info'
columns (
a2_1 varchar(100) PATH '$.eval_cost' ,
a2_2 varchar(100) PATH '$.read_cost',
a2_3 varchar(100) PATH '$.prefix_cost',
a2_4 varchar(100) PATH '$.data_read_per_join'
),
a3 varchar(100) PATH '$.key_length',
a4 varchar(100) PATH '$.table_name',
a5 varchar(100) PATH '$.access_type',
a6 varchar(100) PATH '$.used_key_parts[0]',
a7 varchar(100) PATH '$.rows_examined_per_scan',
a8 varchar(100) PATH '$.rows_produced_per_join',
a9 varchar(100) PATH '$.key'
),
NESTED PATH '$.cost_info'
columns (
b1_1 varchar(100) path '$.query_cost'
),
c INT path "$.select_id"
)
) AS tt;

输出结果:

+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+ 
| rowid | a1_1 | a1_2  | a1_3   | a2_1 | a2_2 | a2_3 | a2_4 | a3   | a4       | a5    | a6   | a7   | a8   | a9   | b1_1 | c   |
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+ 
|     1 | id   | const | 100.00 | 0.20 | 0.00 | 0.00 | 176  | 8    | bigtable | const | id   | 1    | 1    | id   | NULL |   1 |
|     1 | NULL | NULL  | NULL   | NULL | NULL | NULL | NULL | NULL | NULL     | NULL  | NULL | NULL | NULL | NULL | 1.00 |   1 |
+-------+------+-------+--------+------+------+------+------+------+----------+-------+------+------+------+------+------+------+ 
2 rows in set (0.00 sec)

当然,JSON_TABLE 函数还有其他的用法,我这里不一一列举了,详细的参考手册。

请点击输入图片描述

初学Python照着写了个爬虫不知道错误在哪,怎么改?

这是初学者经常犯的错误:

reply_info = json.loads(each.xpath('@data-field')[0].replace('"',''))

reply_info这个数组有可能为0,所以要加个判断,让代码在该数组为空时也能跑,如下:

field_01 = each.xpath('@data-field')
if len(field_01) == 0:
    continue
reply_info = json.loads(field_01[0].replace('"',''))

同理,下面获取contentreply_time的数据时,也需要加入这个判断,以后写代码也要养成这个习惯,加油~

Python模块的几种类型简介

1、系统内置模块

  • os模块:os模块包含普遍的操作系统功能
  • sys模块:提供了一系列有关Python运行环境的变量和函数
  • random模块:random模块用于生成随机数
  • time 模块:主要包含各种提供日期、时间功能的类和函数
  • datetime模块:对time模块的一个高级封装
  • shutil模块:是一种高层次的文件操作工具
  • logging模块:将日志打印到了标准输出中
  • re模块:可以直接调用来实现正则匹配
  • pymysql模块:连接数据库,并实现简单的增删改查
  • threading模块:提供了更强大的多线程管理方案
  • queue模块:实现了多生产者,多消费者的队列
  • json模块:用于字符串和数据类型间进行转换json

2、开源(三方)模块

  • Requests:最富盛名的http库。每个Python程序员都应该有它。
  • Scrapy:从事爬虫相关的工作,这个库也是必不可少的。
  • NumPy:为Python提供了很多高级的数学方法。
  • matplotlib:一个绘制数据图的库。对于数据分析师非常有用。
  • Pygame:开发2D游戏的时候可以用上。
  • Scapy:用Python写的数据包探测和分析库。
  • Django:开源Web开发框架,它鼓励快速开发,并遵循MVC设计,开发周期短。
  • Py2exe:将python脚本转换为windows上可以独立运行的可执行程序。
  • BeautifulSoup:基于Python的HTML/XML解析器,简单易用。
  • PyGtk:基于Python的GUI程序开发GTK+库。

3、自定义模块

自定义模块是自己写的模块,对某段逻辑或某些函数进行封装后供其他函数调用。 注意:自定义模块的命名一定不能和系统内置的模块重名了,否则将不能再导入系统的内置模块了。 例如:自定义了一个sys.py模块后,再想使用系统的sys模块是不能使用的。