検索

ホームページ  >  に質問  >  本文

mysql - 数据库插入频繁导致数据丢失

插入语句有两条,循环插入这两条
只是简单写了下插入语句,没有捕捉到异常

    def process_item(self, item, spider):
        #print(item)
        try:
            with self.connection.cursor() as cursor:
                #Create a new record
                sql1 = "INSERT INTO staff (XNXQ, \
                                          department, \
                                          teacher, \
                                          gender, \
                                          title, \
                                          note1, \
                                          note2) VALUES (%s, %s, %s, %s, %s, %s, %s)"
                cursor.execute(sql1, (item['first']['XNXQ'],
                                     item['first']['department'],
                                     item['first']['teacher'],
                                     item['first']['gender'],
                                     item['first']['title'],
                                     item['first']['note1'],
                                     item['first']['note2']))
                self.connection.commit()

                #Create a new record
                cursor.execute("select max(id) from staff")
                teacherId = cursor.fetchone()['max(id)']
                print('teacherId:' + str(teacherId))
                print(item['second'])
                    
                sql2 = "INSERT INTO staffCourse (teacherId, \
                                                 snum, \
                                                 course, \
                                                 credit, \
                                                 teachWay, \
                                                 courseType, \
                                                 classNum, \
                                                 className, \
                                                 stuNum, \
                                                 week, \
                                                 section, \
                                                 location) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
                cursor.execute(sql2, (teacherId,
                                      item['second']['snum'],
                                      item['second']['course'],
                                      item['second']['credit'],
                                      item['second']['teachWay'],
                                      item['second']['courseType'],
                                      item['second']['classNum'],
                                      item['second']['className'],
                                      item['second']['stuNum'],
                                      item['second']['week'],
                                      item['second']['section'],
                                      item['second']['location']))
                self.connection.commit()

        except Exception as e:
            print('------------------------------------------')
            print(e)

查看数据库时,发现少了很多,我猜应该是频繁插入导致数据丢失的,因为我在插入数据库之前把数据print了一下,没少。
怎么解决这个问题?

天蓬老师天蓬老师2777日前1721

全員に返信(4)返信します

  • 天蓬老师

    天蓬老师2017-04-17 15:16:37

    一度に何回も繰り返しましたか?
    私の記憶が正しければ。データベースにはキュー キャッシュがあります。一度に大量のデータをキャッシュに詰め込んでキャッシュがいっぱいになると、キャッシュが失われます
    挿入するデータが大量にある場合は、キューを自分で実装する必要があります。その後定期的に挿入してください

    またはトランザクションを試してください

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 15:16:37

    私は Python 構文を理解していないため、SQL の観点から 2 つの解決策のみを提供します。
    1. トランザクション メソッドを使用してデータを書き込み、1000 個のデータごとに送信します。例:

    偽コード

    リーリー

    2. SQL をバッチ書き込みに変更すると、パフォーマンスが大幅に向上します

    リーリー

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 15:16:37

    データベースのログや実行記録を確認できます。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 15:16:37

    コード内にinsertと書いていますが、commitします。ただし、いつコミットするかは、ここでのユーザーではなく、プロジェクト内のトランザクションによって制御されます。プロジェクトはトランザクションを側面から制御する場合があります。解決策:
    1. ページに挿入し、トランザクションを設定します。一度に挿入せず、バッチで挿入し、データをバッチでコミットします。

    返事
    0
  • キャンセル返事