2009-12-09 6 views
1

J'utilise PyQt pour insérer des enregistrements dans une base de données MySQL. le code ressemble essentiellement àQSqlTableModel.insertRecord() est très lent

self.table = QSqlTableModel() 
self.table.setTable('mytable') 
while True: 
    rec = self.table.record() 
    values = getValueDictionary() 
    for k,v in values.items(): 
    rec.setValue(k,QVariant(v)) 
    self.table.insertRecord(-1,rec) 

La table contient actuellement ~ 50 000 lignes. J'ai chronométré chaque ligne et trouvé que la fonction insertRecord prend ~ 5 secondes pour s'exécuter, ce qui est inacceptable lent. Tout le reste est rapide.

A titre de comparaison, j'ai aussi fait une version du code qui utilise

QSqlQuery.prepare("INSERT INTO mytable (f1,f2,...) VALUES (:f1, :f2,...)") 
query.bindValue(":f1",blah) 
query.exec_() 

Dans ce cas, tout cela ne prend que ~ 20 millisecondes, de sorte que le retard est pas dans la connexion de base de données pour autant que je Peut dire.

Je préfère vraiment utiliser les trucs QtSql au lieu des commandes MySQL. Des idées sur comment ajouter un tas de lignes à une base de données MySQL avec QtSql au lieu de commandes brutes et à une vitesse raisonnable?

Merci, G

Répondre

1

choses à essayer:

et voir si ça aide ...

0

vous s hould utiliser begin before et commit après la boucle, ou désactiver la fonctionnalité autocommit de MySQL .. cela vous donnera généralement une augmentation de performance de 50% ou plus ..