Discussion de l'article "SQLite Gestion native des bases de données SQL dans MQL5" - page 8

Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Et la question #2 :
En essayant d'utiliser les fonctions ATTACH/DETACH pour transférer des données entre des bases de données en utilisant le mécanisme intégré de SQLite, le résultat est une erreur de transaction 5601...
Lorsque l'on exécute la même transaction dans SQLiteStudio, tout va bien.
Est-ce fait exprès ou y a-t-il quelque chose qui ne fonctionne pas ?
Malheureusement, la fonction DatabaseExport n'a pas reçu la fonctionnalité d'exportation de la table (bien que cette fonctionnalité ait été prévue à l'origine) et ne prend actuellement en charge que les requêtes.
En ce qui concerne l'erreur 4022, l'obtenez-vous pendant les tests, si oui, le testeur a une limitation sur la taille du fichier d'exportation - 1GB de taille totale des données écrites sur le disque ?
Lorsque j'exécute la même transaction dans SQLiteStudio, tout se passe bien.
Est-ce fait exprès ou y a-t-il quelque chose qui ne fonctionne pas ?
Malheureusement, la fonction DatabaseExport n'a jamais été dotée de la fonctionnalité d'exportation de tables (bien que cette fonctionnalité ait été prévue à l'origine) et ne prend actuellement en charge que les requêtes.
En ce qui concerne l'erreur 4022, l'obtenez-vous pendant les tests, si oui, le testeur a une limitation sur la taille du fichier d'exportation - 1GB de taille totale des données écrites sur le disque ?
L'erreur 4022 apparaît sans testeur, si vous spécifiez une requête au lieu d'un nom de table dans la fonction DatabaseExport.
La taille de la base de données est inférieure à 10 Mb, je prévoyais d'utiliser cette fonctionnalité pour copier les données de la base de données sur disque vers la base de données en mémoire.La requête devrait fonctionner, vérifiez si les chemins sont corrects.
Merci, je vais essayer de fournir le chemin différemment, mais en fait dans SQLiteStudio la requête sur le chemin spécifié fonctionne, j'ai sorti la requête dans le journal du terminal et ensuite copié et exécuté dans SQLiteStudio sans problèmes.
Je vais écrire sur le résultat.
Testez l'écriture multithread dans la base de données, exécutez plusieurs copies du script, chaque copie peut être étiquetée avec le paramètre expert_id.
Tout est écrit correctement :
Mais j'obtiens des erreurs de blocage :
Il devrait y avoir un mécanisme d'insertion conditionnelle d'enregistrements sans retour d'erreur.
La requête devrait fonctionner, assurez-vous que les chemins d'accès sont corrects.
1. Vérifié ATTACH DATABASE fonctionne !
Le problème était le suivant, j'ai essayé d'attacher à la base créée en RAM, la base physique dans ce cas ATTACH DATABASE ne fonctionne pas, mais si on attache la base RAM à la base physique, cela fonctionne !
Cela me suffit amplement pour créer une copie de la base en RAM, ce qui accélère les calculs)))
2. J'ai décidé d'aller plus loin... et de vérifier une autre possibilité, à savoir :
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS M ;
Selon l'idée, la base de données devrait être créée en RAM et cesser d'exister après la fermeture de la discussion, mais son comportement est différent...
En 1, je peux la joindre à partir de n'importe quel programme MQL5, Expert Advisor, indicateur, script, service,
En 2, les données sont sauvegardées pour toujours, même après un redémarrage, j'ai déjà pensé ... que peut-être la base de données est créée physiquement, mais une recherche par le nom *memdb1*n'a rien trouvé.
P.S. Peut-être parce que j'ai créé la base à partir de l'indicateur, et qu'elle fonctionne en fil rouge ?
C'est une fonctionnalité sympa, mais j'aimerais savoir si elle restera dans le terminal dans les prochaines mises à jour et après mon message à ce sujet : )))).
Dans ce cas, vous pouvez facilement transférer de grandes quantités de données entre les programmes, sans problèmes ni retards, et vous n'utilisez pas de variables globales limitées par la longueur du nom....
Dans une telle exécution, il est supprimé une fois que le programme MQL5 est terminé :
ATTACH DATABASE ':memory:?cache=shared' AS M ;
ATTACH DATABASE ':memory:' AS M;
Bonjour !
Question aux développeurs de MT, est-il possible de désactiver l'attribut Shared de la bibliothèque SQLite, l'expérience d'autres projets ayant permis de déterminer que c 'est la cause de l'erreur : database error , database is locked ( erreur de base de données, la base de données est verrouillée).
Si vous accédez à la base de données à partir de différents threads, tout est résolu au niveau de la base de données elle-même, à savoir en exécutant ces deux requêtes immédiatement après l'ouverture de la base de données :
1. PRAGMA journal_mode = WAL ;
2. PRAGMA busy_timeout = 1000 ;
mais l'erreur de verrouillage ne disparaîtra qu'après avoir rendu la base non partagée, vous ne pouvez pas le faire avec des requêtes.
Si l'accès à la base de données se fait à partir de différents threads, tout est résolu au niveau de la base de données elle-même, à savoir en exécutant ces deux requêtes immédiatement après l'ouverture de la base de données :
1. PRAGMA journal_mode = WAL ;
2. PRAGMA busy_timeout = 1000 ;
mais l'erreur de verrouillage ne disparaîtra qu'après avoir rendu la base non partagée, vous ne pouvez pas le faire avec des requêtes.
Dans ce cas, la vitesse des requêtes diminuera et les besoins en mémoire augmenteront....
mais tout va bien :-)
SQLite est conçu pour un thread ou un auteur et de nombreux lecteurs. Beaucoup de rédacteurs ne sont pas sur ce sujet, sur ce sujet d'autres bases qui ne sont pas "légères".
Ce n'est pas à propos de MQL - c'est juste la façon dont c'est vraiment et partout.