Discussão do artigo "SQLite: trabalho nativo com bancos de dados SQL em MQL5" - página 8
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
E a pergunta nº 2:
Ao tentar usar as funções ATTACH/DETACH para transferir dados entre bancos de dados usando o mecanismo interno do SQLite, o resultado é um erro de transação 5601...
Ao executar a mesma transação no SQLiteStudio, tudo fica bem.
Isso é feito de propósito ou há algo que não está funcionando?
Infelizmente, a função DatabaseExport não recebeu a funcionalidade de exportar a tabela (embora essa funcionalidade tenha sido originalmente planejada) e atualmente suporta apenas consultas.
Sobre o erro 4022, você o recebe durante o teste? Se sim, o testador tem uma limitação no tamanho do arquivo de exportação - tamanho total de 1 GB de dados gravados no disco?
Ao executar a mesma transação no SQLiteStudio, tudo está bem.
Isso é feito de propósito ou há algo que não está funcionando?
Infelizmente, a função DatabaseExport nunca obteve a funcionalidade de exportação de tabelas (embora essa funcionalidade tenha sido originalmente planejada) e atualmente só oferece suporte a consultas.
Quanto ao erro 4022, você o recebe durante o teste? Se sim, o testador tem uma limitação no tamanho do arquivo de exportação - tamanho total de 1 GB de dados gravados no disco?
O erro 4022 aparece sem o testador, se você especificar a consulta em vez do nome da tabela na função DatabaseExport.
O tamanho do banco de dados é inferior a 10 Mb, e eu estava planejando usar essa funcionalidade para copiar dados do banco de dados no disco para o banco de dados na memória.A consulta deve funcionar, verifique se os caminhos estão corretos
Obrigado, tentarei fornecer o caminho de forma diferente, mas, de fato, no SQLiteStudio, a consulta no caminho especificado funciona, eu gerei a consulta no log do terminal e, em seguida, copiei e executei no SQLiteStudio sem problemas.
Vou escrever sobre o resultado.
Teste a gravação multi-threaded no banco de dados, execute várias cópias do script, cada cópia pode ser rotulada com o parâmetro expert_id.
Tudo é gravado corretamente:
Mas recebo erros sobre bloqueio:
Deve haver um mecanismo de inserção de registro condicional sem retornar um erro.
A consulta deve funcionar, mas verifique se os caminhos estão corretos
1. Verifiquei que o ATTACH DATABASE funciona!
O problema foi o seguinte: tentei anexar à base criada na RAM, a base física, nesse caso, o ATTACH DATABASE não funciona, mas se anexarmos a base RAM à base física, ele funciona!
Isso é suficiente para que eu crie uma cópia da base na RAM, o que acelera os cálculos)))
2. Decidi ir além... e verificar mais uma possibilidade, a saber:
ATRIBUIR BANCO DE DADOS 'file:memdb1?mode=memory&cache=shared' COMO M;
De acordo com a ideia, o banco de dados deve ser criado na RAM e deixar de existir depois que o thread for fechado, mas seu comportamento é diferente...
Em 1, posso entrar nele a partir de qualquer programa MQL5, Expert Advisor, indicador, script, serviço,
No 2, os dados nele contidos são salvos para sempre, mesmo após a reinicialização, já pensei... que talvez o banco de dados seja criado fisicamente, mas uma pesquisa pelo nome *memdb1*não encontrou nada
P.S. Talvez porque eu tenha criado a base a partir do indicador e ela funcione em um thread comum?
Esse é um recurso interessante, mas eu gostaria de saber se ele permanecerá no terminal nas próximas atualizações e depois da minha mensagem sobre isso:)))).
Nesse caso, você pode transferir facilmente grandes quantidades de dados entre programas, sem problemas e atrasos, e não usar variáveis globais limitadas pelo comprimento do nome....
Em tal execução, ela é excluída após o término do programa MQL5:
ATTACH DATABASE ':memory:?cache=shared' AS M;
ATTACH DATABASE ':memory:' AS M;
Boa tarde!
Pergunta para os desenvolvedores do MT, é possível desativar o atributo Shared da biblioteca SQLite, pois a experiência em outros projetos determinou que essa é a causa do erro: database error , database is locked.
Se estiver acessando o banco de dados de diferentes threads, tudo será resolvido no nível do próprio banco de dados, ou seja, executando essas duas consultas imediatamente após abrir o banco de dados:
1. PRAGMA journal_mode = WAL;
2. PRAGMA busy_timeout = 1000;
mas o erro de bloqueio só será eliminado depois que você tornar a base não compartilhada, não é possível fazer isso com consultas.
Se o acesso ao banco de dados for feito por threads diferentes, tudo será resolvido no nível do próprio banco de dados, ou seja, executando essas duas consultas imediatamente após a abertura do banco de dados:
1. PRAGMA journal_mode = WAL;
2. PRAGMA busy_timeout = 1000;
mas o erro de bloqueio só desaparecerá depois que você tornar a base não compartilhada; não é possível fazer isso com consultas.
Nesse caso, a velocidade das consultas cairá e os requisitos de memória aumentarão....
mas está tudo bem :-)
O SQLite foi projetado para uma thread ou um escritor e muitos leitores. Muitos escritores não se preocupam com isso, mas com outras bases que não são "leves".
Não se trata de MQL - é assim que as coisas são na realidade e em toda parte.