从列表交互中在mysql表中插入数据的最佳方法

时间:2014-04-19 18:13:01

标签: python mysql

我有一个大的json文件(+ - 50mb),我必须迭代,处理一些文本,然后将处理过的文本插入到mysql表中。

我怀疑是:

在迭代json文件时,在表中按记录插入是否更好?

move one item in json -> extract info I need -> open db connection -> insert record -> close db connection -> move to next item in json file... and so on until end of file

在这种情况下,最好每次都打开和关闭数据库连接,还是将其打开直到json文件结束?

或者我认为的另一个选项是迭代json文件并创建一个字典列表(每个记录一个字典,键作为要插入的字段,键的值作为要插入的值在数据库中)然后插入数据库。

iterate over json file -> extract info I need -> store info in dictionary -> add dictionary to a list -> repeat until the end of the file -> open db connection -> iterate over list -> insert record

在这种情况下,是否可以立即将整个列表插入数据库中,而不是使用for ... i ...按记录插入记录来迭代列表?

关于什么是最佳选择的任何想法?

很抱歉,如果问题可能看起来很愚蠢,但我是初学者,无法在任何地方找到这个答案......我有超过100.000条记录要插入......

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

将所有记录一次性插入到数据库中肯定要好得多:创建和关闭连接以及执行多个INSERT语句而不是只执行一个INSERT语句会产生相当大的开销。如果mysql chokes尝试添加例如块,则可能一次插入100,000条记录。一次完成1000条记录。

我假设内存使用不会成为问题;这当然取决于每条记录的大小。

如果您经常需要从python访问数据库,我的建议是使用sqlalchemy来访问数据库。绝对值得投资!使用sqlalchemy,代码将是这样的:

CHUNKSIZE = 1000

< parse JSON >
< store into a list of dictionaries 'records' >

< Refer to sqlalchemy tutorial for how to create Base and Session classes >

class MyRecord(Base):
  ''' SQLAlchemy record definition. 
      Let the column names correspond to the keys in the record dictionaries
  '''
  ...

session = Session()
for chunk in [records[CHUNKSIZE*i:CHUNKSIZE*(i+1)] for i in range(1+len(records)/CHUNKSIZE):
  for rec in chunk:
    session.add(MyRecord(**rec))
  session.commit()