python中把json批量插入或者更新到SqlServer?

  最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试。故而重操python旧业,通过python编写脚本来构造类似线上的调度场景。在脚本编写过程中,碰到这样一个需求:要在测试环境创建10000个作业流。

  最开始的想法是在一个azkaban project下循环调用10000次create job接口(每个Flow只包含一个job)。由于azkaban它本身没有增加/删除作业流的接口,所有的作业流修改、增加、删除其实都是通过重新上传项目zip包实现的,相应地每次调猛犸前端的create job接口,实际上是在猛犸端对zip包的内容进行了重新的整合后再重新上传zip包到azkaban,整个过程可以拆解成如下过程:解压zip包获得zip包内容,变更zip包内的文件内容,重新打包zip包,上传到azkaban。因此,随着循环次数越往后,zip包包含的内容会越多,接口执行一次的时间就越长。实践发现,第一次调该接口的时间大致不到1秒,到循环1000次的时候接口调用一次的时间就达到了将近3秒。因此,如果指望一个循环10000次来构造该场景,显然要耗费巨大的时间。

  在此背景下, 自然而然地就想到用多进程/多线程的方式来处理该问题。

二、“多任务”的操作系统基础

  大家都知道,操作系统可以同时运行多个任务。比如你一边听音乐,一边聊IM,一边写博客等。现在的cpu大都是多核的,但即使是过去的单核cpu也是支持多任务并行执行。

  单核cpu执行多任务的原理:操作系统交替轮流地执行各个任务。先让任务1执行0.01秒,然后切换到任务2执行0.01秒,再切换到任务3执行0.01秒...这样往复地执行下去。由于cpu的执行速度非常快,所以使用者的主观感受就是这些任务在并行地执行。

  多核cpu执行多任务的原理:由于实际应用中,任务的数量往往远超过cpu的核数,所以操作系统实际上是把这些多任务轮流地调度到每个核心上执行。

  对于操作系统来说,一个应用就是一个进程。比如打开一个浏览器,它是一个进程;打开一个记事本,它是一个进程。每个进程有它特定的进程号。他们共享系统的内存资源。进程是操作系统分配资源的最小单位。

  而对于每一个进程而言,比如一个视频播放器,它必须同时播放视频和音频,就至少需要同时运行两个“子任务”,进程内的这些子任务就是通过线程来完成。线程是最小的执行单元。一个进程它可以包含多个线程,这些线程相互独立,同时又共享进程所拥有的资源。

三、Python多进程编程

  multiprocessing是Python提供的一个跨平台的多进程模块,通过它可以很方便地编写多进程程序,在不同的平台(Unix/Linux, Windows)都可以执行。

  下面就是使用multiprocessing编写多进程程序的代码:  

  某些情况下,我们希望批量创建多个子进程,或者给定子进程数的上限,避免无限地消耗系统的资源。通过Pool(进程池)的方式,就可以完成这项工作,下面是使用Pool的代码:

  close:关闭进程池,使之不能再添加新的进程。已经执行的进程会等待继续执行直到结束。

  terminate:强制终止线程池,正在执行的进程也会被强制终止。

  Lock:当多个子进程对同一个queue执行写操作时,为了避免并发操作产生冲突,可以通过加锁的方式使得某个子进程对queue拥有唯一的写权限,其他子进程必须等待该锁释放后才能再开始执行写操作。

  下面就是使用Queue进行进程间通信的代码:在父进程里创建两个子进程,分别实现对queue的读和写操作

  程序的输出结果为:

  Pipe是另一种进程间通信的方式,俗称“管道”。它由两端组成,一端往管道里写入数据,另一端从管道里读取数据。
  下面就是使用Pipe通信的代码:

  程序的输出结果如下:

}

爬取到的是图一这样的数据,怎么存入到数据库中,我的存储语句是图二这样的,但是报错了,ternalError: (1241, u'Operand should contain 1 column(s)'),而且json中有列表数据,所以应该怎么存啊,跪求大神


json的数据json.loads进来以后会变成一个json的对象,你需要自己把python对象中的字段值取出来,拼成sql语句

你对这个回答的评价是?

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

}

所以我有一堆Python中的数组数据。那么,我有一个列表清单。我试图将这个数组存储到MySQL数据库中的一个单元中。我试图使用JSON来序列化我的数据,但也许我不明白JSON是如何工作的。

所以连接到我的数据库后:(我试过LONGTEXT LONGBLOB和数据类型上下游

我看到JSON对象表现为一个长字符串,有很多单引号的所有的地方(的名单,并在外面代表一个字符串)。当我做了json.dumps(json.dumps(upstream_data))时,内部引号变成了双引号“”,前面加了\字符。尽管如此,我也遇到了同样的错误。

任何想法?如果没有,更好的方法来将Python数组/列表数据存储到单个MySQL单元中?

你只是以不正确的方式调用数据库API,如果你用这样的参数来替换你的参数,那么你将自己负责数据中的引号和双引号。

这不仅可以给你tehe错误,你有(并为此幸运),因为这还允许SQL注入的危险攻击。

Python的数据库API是从头开始设计的,以避免发生这种攻击的可能性,并且通过让cursor.execute为您进行字符串替换来做到这一点。然后它会将必要的转义添加到您的字符串中。所以,与其做:

--Still,如果你需要在你的源文件中的所有那些疯狂的硬编码的数字,而不是一个自动生成的文件,我敢说你的项目注定要失败。

我希望这个问题是由于逃避SQL命令,或者说缺乏相同。

除此之外,它如果你通过用户输入有(查找“小约翰尼表”,如果你不知道为什么)是不安全的。

而让MySQL的接口理清逃逸。

您需要让MySQL库为您做参数处理;这有让MySQL的准备你的发言,使得重复插入快过额外的好处:

见对SQL参数化(一些)的更多细节。每个数据库适配器都记录了确切支持的参数格式,因此也请检查。的MySQLdb的模块,例如,模仿蟒字符串格式化语法,并且使用%s用作占位符:

其它可能的参数选项是数字(:1, :2等),名称(:foo, :bar)或蟒的其它形式的字符串格式,命名格式说明符:(%(foo)s, %(bar)s)。

,我与你的代码中看到的第一个问题是这样的:

你不应该做的 - 你使用字符串插值,它不保护您免受SQL注入攻击或恶意SQL。

大多数蟒DB API使用的占位符语法类似于此:

请注意,您在声明和值传递分开。 API处理转义和格式化。

一些将允许类型的字典以及:

阅读上如何正确使用你的数据库API - 这是你最大的问题,并可能导致您的所有其他问题。

你可能会尝试的一件事是使用SQLAlchemy的,它可以处理所有的转义行为,并且可以避免处理许多安全漏洞(至少在插入SQL数据库等方面)。它参数化查询,而不是像你正在做的那样进行内联字符串插值。

}

我要回帖

更多关于 怎样将sql文件导入数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信