Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Testar integração do Power BI com bancos de dados (duckdb, sqlite e postgres) #12

Closed
fjuniorr opened this issue Apr 10, 2023 · 9 comments
Assignees

Comments

@fjuniorr
Copy link
Contributor

Alguns itens para guiar a avaliação são:

  • quais dependências precisam ser instaladas?
  • as colunas são importadas com os tipos corretos?
  • o cruzamento entre tabelas acontece na ferramenta de BI ou no banco de dados?
  • existe importação de chaves primárias e estrangeiras definidas no banco de dados?

Pra fins de comparação entre ferramentas criar uma tabela de saldo de empenho para 2022:

ANO FONTE_RECURSO_COD FONTE_RECURSO_DESC DESPESA EMPENHADA DESPESA LIQUIDADA SALDO DE EMPENHO
2022 10 RECURSO ORDINARIO 80,00 30,00 50,00
2022 20 VINCULADO 20,00 10,00 10,00
@labanca
Copy link

labanca commented Apr 17, 2023

Conectar à base do SQLite no Power BI:

  1. Baixar o driver ODBC do SQLite para Windows.
  2. Instalar o Driver (Nenhuma parametrização necessária, somente rodar o instalador)
  3. No Power BI selecionar a opção no barra de ferramentas "Get Data"
  4. No campo de busca procurar por ODBC e selecioná-lo e clicar em "connect"
  5. Na janela "FROM ODBC" no campo "Data Source Name (DSN) selecionar a opção "SQLite3 Datasource"
  6. Clicar em "Advanced Options" ainda na mesma janela para expandir as configurações.
  7. Na caixa de texto "Connection String" adicionar o seguinte parâmetro: database=C:\caminho\da\database\nomedabase.db;
    No caso na minha máquina ficou como: database=C:\Projects\sqlite-carga-despesa\database\dadosmg.db;
  8. Clicar no botão ok.
  9. Caso ele exiba uma janela perguntando as credenciais de conexão no banco, seleciona na esquerda a primeira opção "Default", deixa o campo em branco e clique para continuar.
  10. Se a conexão for bem sucedida a janela "NAVIGATOR" deve ser exibida e as tabelas contidas na base de dados. Basta selecionar as que deseja importar e clicar em "load" para carregá-las diretamente para o Power BI ou "Transform" para manipular os dados antes de carregá-los.

@labanca
Copy link

labanca commented Apr 18, 2023

@hslinhares @fjuniorr

Estou tentando importar as tabelas para o Power BI. Todas exceto a tabela fato foram importadas sem problemas, mas a tabela fato (ft_despesa) está apresentando o seguinte erro:

erro-import-powerbi

Se algum de vocês conseguir testar em suas máquinas eu conseguiria excluir a possibilidade do erro ser da minha máquina (já que ele acusa problema na memória RAM). Tenho 64 GB e não chegou nem a ocupar 30 GB durante a importação.

Estou procurando sobre esse erro, mas não encontrei nada ainda que case com a situação.

@fjuniorr
Copy link
Contributor Author

fjuniorr commented Apr 19, 2023

To tentando rodar o projeto no windows mas deu erro:

$ make all
0 [None] --- None despesa
Traceback (most recent call last):
  File "C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\main.py", line 100, in <module>
    con = sqlite3.connect(DB_NAME) #Cria se n▒o existe e se conecta ▒ base de dados
          ^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: unable to open database file
make: *** [makefile:11: all] Error 1

Pra corrigir precisa de criar a pasta database manualmente.

@fjuniorr
Copy link
Contributor Author

Mesmo erro aqui @labanca:

Feedback Type:
Frown (Error)

Error Message:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Stack Trace:
Microsoft.Mashup.Host.Document.SerializedException

Server stack trace: 


Exception rethrown at [0]: 
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Mashup.OleDbProvider.DataHost.NonBufferingMashupEvaluator.MashupEvaluation.OnEvaluationComplete(AsyncResult`1 result)

Exception rethrown at [1]: 
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Mashup.OleDbProvider.MashupCommandEvaluation.get_PageReader()
   at Microsoft.Mashup.OleDbProvider.TracingRowset.Microsoft.OleDb.IEvaluationResultSource.WaitForResults()

Stack Trace Message:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Invocation Stack Trace:
   at Microsoft.Mashup.Host.Document.ExceptionExtensions.GetCurrentInvocationStackTrace()
   at Microsoft.Mashup.Client.UI.Shared.StackTraceInfo..ctor(String exceptionStackTrace, String invocationStackTrace, String exceptionMessage)
   at Microsoft.PowerBI.Client.Windows.Telemetry.PowerBIUserFeedbackServices.GetStackTraceInfo(Exception e)
   at Microsoft.PowerBI.Client.Windows.Telemetry.PowerBIUserFeedbackServices.ReportException(IWindowHandle activeWindow, IUIHost uiHost, FeedbackPackageInfo feedbackPackageInfo, Exception e, Boolean useGDICapture)
   at Microsoft.Mashup.Client.UI.Shared.UnexpectedExceptionHandler.<>c__DisplayClass14_0.<HandleException>b__0()
   at Microsoft.Mashup.Host.Document.SynchronizationContextExtensions.<>c__DisplayClass2_0.<SendAndMarshalExceptions>b__0(Object null)
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
   at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
   at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
   at Microsoft.Mashup.Client.UI.Windows.DialogWindowBase.ShowModal(IWindowHandle windowHandle)
   at Microsoft.Mashup.Client.UI.Shared.WindowManager.ShowModal[T](T dialog, Func`1 showModalFunction)
   at Microsoft.PowerBI.Client.Windows.FloatingDialog.KoLoadToReportDialog.TryShowDialog(Report report, IExceptionHandler exceptionHandler, IPowerBIWindowService windowService, IPowerBIQueryUIService queryServices, IDesktopModelingHost modelingHost, LocalizedString title, LoadToModelContext loadToModelContext)
   at Microsoft.PowerBI.Client.Windows.FloatingDialog.KoLoadToReportDialog.<>c__DisplayClass16_0.<TryShowDialogForQueries>b__0()
   at Microsoft.PowerBI.Client.Windows.Report.<>c__DisplayClass68_0`1.<SynchronizeLooselyWithQueries>b__0()
   at Microsoft.PowerBI.Client.Windows.Report.<SynchronizeLooselyWithQueriesAsync>d__69`1.MoveNext()
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Start[TStateMachine](TStateMachine& stateMachine)
   at Microsoft.PowerBI.Client.Windows.Report.SynchronizeLooselyWithQueriesAsync[T](Func`1 getTask)
   at Microsoft.PowerBI.Client.Windows.Report.SynchronizeLooselyWithQueries[T](Func`1 action)
   at Microsoft.PowerBI.Client.Windows.PowerBIDataImporter.LoadQueries(IEnumerable`1 queriesToLoad)
   at Microsoft.PowerBI.Client.Windows.PowerBIDataImporter.OnImportSuccess(IEnumerable`1 addedQueries, DataImportDestination destination)
   at Microsoft.Mashup.Client.UI.Shared.DataImporter.ProcessImportedQueries(IEnumerable`1 importedQueries, DataImportDestination destination)
   at Microsoft.Mashup.Client.UI.Shared.DataImporter.ImportNavigationSource(Query query)
   at Microsoft.Mashup.Client.UI.Shared.DataImporter.OnGetPreviewResult(PreviewResult preview, Query query, String sourceID, String formulaTitle, Nullable`1 explicitImportDestination, Boolean isNewQuery, Boolean isFromEditor)
   at Microsoft.Mashup.Client.UI.Shared.DataImporter.GetPreviewResult(Query query, String sourceID, String formulaTitle, Boolean isNewQuery, Boolean isFromEditor, Nullable`1 explicitImportDestination)
   at Microsoft.Mashup.Client.UI.Shared.DataImporter.<>c__DisplayClass87_0.<OnQuerySettingsResolved>b__0()
   at Microsoft.Mashup.Host.Document.ExceptionHandlerExtensions.HandleExceptions(IExceptionHandler exceptionHandler, Action action)
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
   at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
   at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
   at Microsoft.Mashup.Client.UI.Shared.WindowManager.ShowModal[T](T dialog, Func`1 showModalFunction)
   at Microsoft.PowerBI.Client.Program.<>c__DisplayClass5_1.<RunApplication>b__4()
   at Microsoft.PowerBI.Client.Windows.IExceptionHandlerExtensions.<>c__DisplayClass3_0.<HandleExceptionsWithNestedTasks>b__0()
   at Microsoft.Mashup.Host.Document.ExceptionHandlerExtensions.HandleExceptions(IExceptionHandler exceptionHandler, Action action)
   at Microsoft.PowerBI.Client.Program.RunApplication(String[] args)
   at Microsoft.PowerBI.Client.Program.Main(String[] args)


PowerBINonFatalError:
{"AppName":"PBIDesktop","AppVersion":"2.115.842.0","ModuleName":"","Component":"Microsoft.Mashup.OleDbProvider.DataHost.NonBufferingMashupEvaluator.MashupEvaluation","Error":"Microsoft.Mashup.Host.Document.SerializedException - Microsoft.Mashup.Evaluator.Interface.ErrorException","MethodDef":"OnEvaluationComplete","ErrorOffset":""}

Snapshot Trace Logs:
C:\Users\m752587\AppData\Local\Microsoft\Power BI Desktop\FrownSnapShot610c3325-e1e7-411c-b97f-c85a1c04f6bb.zip

Model Default Mode:
Empty

Model Version:
PowerBI_V1

Performance Trace Logs:
C:\Users\m752587\AppData\Local\Microsoft\Power BI Desktop\PerformanceTraces.zip

Enabled Preview Features:
PBI_enableWebView2
PQ_WebView2Connector
PBI_sparklines
PBI_scorecardVisual
PBI_fieldParametersSuperSwitch
PBI_horizontalFusion
PBI_relationshipEditPane
PBI_setLabelOnExportPdf

Disabled Preview Features:
PBI_shapeMapVisualEnabled
PBI_SpanishLinguisticsEnabled
PBI_qnaLiveConnect
PBI_azureMapVisual
PBI_compositeModelsOverAS
PBI_b2bExternalDatasetSharing
PBI_enhancedTooltips
PBI_NlToDax
PBI_optimizeTabRibbon
PBI_angularRls
PBI_onObject

Disabled DirectQuery Options:
TreatHanaAsRelationalSource

Cloud:
GlobalCloud

PowerBINonFatalError_ErrorDescription:
Microsoft.Mashup.Evaluator.Interface.ErrorException

PowerBIUserFeedbackServices_IsReported:
True

Formulas:


section Section1;

shared dm_acao = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_acao_Table = Source{[Name="dm_acao",Kind="Table"]}[Data]
in
    dm_acao_Table;

shared dm_categ_econ = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_categ_econ_Table = Source{[Name="dm_categ_econ",Kind="Table"]}[Data]
in
    dm_categ_econ_Table;

shared dm_elemento_desp = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_elemento_desp_Table = Source{[Name="dm_elemento_desp",Kind="Table"]}[Data]
in
    dm_elemento_desp_Table;

shared dm_empenho_desp = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_empenho_desp_Table = Source{[Name="dm_empenho_desp",Kind="Table"]}[Data]
in
    dm_empenho_desp_Table;

shared dm_favorecido = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_favorecido_Table = Source{[Name="dm_favorecido",Kind="Table"]}[Data]
in
    dm_favorecido_Table;

shared dm_fonte = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_fonte_Table = Source{[Name="dm_fonte",Kind="Table"]}[Data]
in
    dm_fonte_Table;

shared dm_funcao_desp = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_funcao_desp_Table = Source{[Name="dm_funcao_desp",Kind="Table"]}[Data]
in
    dm_funcao_desp_Table;

shared dm_grupo_desp = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_grupo_desp_Table = Source{[Name="dm_grupo_desp",Kind="Table"]}[Data]
in
    dm_grupo_desp_Table;

shared dm_item_desp = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_item_desp_Table = Source{[Name="dm_item_desp",Kind="Table"]}[Data]
in
    dm_item_desp_Table;

shared dm_modalidade_aplic = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_modalidade_aplic_Table = Source{[Name="dm_modalidade_aplic",Kind="Table"]}[Data]
in
    dm_modalidade_aplic_Table;

shared dm_procedencia = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_procedencia_Table = Source{[Name="dm_procedencia",Kind="Table"]}[Data]
in
    dm_procedencia_Table;

shared dm_programa = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_programa_Table = Source{[Name="dm_programa",Kind="Table"]}[Data]
in
    dm_programa_Table;

shared dm_situacao_op_desp = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_situacao_op_desp_Table = Source{[Name="dm_situacao_op_desp",Kind="Table"]}[Data]
in
    dm_situacao_op_desp_Table;

shared dm_subfuncao_desp = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_subfuncao_desp_Table = Source{[Name="dm_subfuncao_desp",Kind="Table"]}[Data]
in
    dm_subfuncao_desp_Table;

shared dm_tempo_diario = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_tempo_diario_Table = Source{[Name="dm_tempo_diario",Kind="Table"]}[Data]
in
    dm_tempo_diario_Table;

shared dm_tipo_documento = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_tipo_documento_Table = Source{[Name="dm_tipo_documento",Kind="Table"]}[Data]
in
    dm_tipo_documento_Table;

shared dm_unidade_orc = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    dm_unidade_orc_Table = Source{[Name="dm_unidade_orc",Kind="Table"]}[Data]
in
    dm_unidade_orc_Table;

shared fl_despesa_pgto = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    fl_despesa_pgto_Table = Source{[Name="fl_despesa_pgto",Kind="Table"]}[Data]
in
    fl_despesa_pgto_Table;

shared ft_despesa = let
    Source = Odbc.DataSource("database=C:\Users\m752587\Downloads\sqlite-carga-despesa-main\sqlite-carga-despesa-main\database\dadosmg.db;dsn=SQLite3 Datasource", [HierarchicalNavigation=true]),
    ft_despesa_Table = Source{[Name="ft_despesa",Kind="Table"]}[Data]
in
    ft_despesa_Table;

@labanca
Copy link

labanca commented Apr 20, 2023

Consegui realizar a carga de todas a base de dados. Comecei procurando outros drivers ODBC e encontrei o da devart.

O problema é que esse driver é proprietário e utilizei um trial de 30 dias para fazer os testes. Ao que parece, o erro de escrever em regiões protegidas da memória era causada pelo driver open source que utilizei anteriormente.

@fjuniorr
Copy link
Contributor Author

Alguns itens para guiar a avaliação são:

  • quais dependências precisam ser instaladas?
  • as colunas são importadas com os tipos corretos?
  • o cruzamento entre tabelas acontece na ferramenta de BI ou no banco de dados?
  • existe importação de chaves primárias e estrangeiras definidas no banco de dados?

@labanca relata aqui no issue as conclusões que você já chegou para o sqlite e posteriormente para os demais bancos.

@labanca
Copy link

labanca commented May 2, 2023

A importação do Postgres para o Power BI funcionou sem problemas. Postarei posteriormente a avaliação dos 3 bancos neste issue.

@labanca
Copy link

labanca commented May 2, 2023

Avaliação dos Bancos e Integrações

Os testes foram realizados no Power BI Desktop versão 2.116.622.0 64-bit (abril de 2023)

DuckDB

Código da carga de dados: (https://github.com/splor-mg/duckdb-carga-despesa)

As ferramentas de BI conseguiram conectar e consumir os dados?

Não, mesmo com o driver oficial fornecido para o DuckDB o Power BI não conseguiu importar os dados ou visualizar as tabelas.

Quais dependências precisam ser instaladas?

duckdb==0.7.1
pandas==1.5.2
ckanapi==4.0
Driver ODBC do DuckDB

as colunas são importadas com os tipos corretos?

Sim.

O cruzamento entre tabelas acontece na ferramenta de BI ou no banco de dados?

Não foram feitos testes de cruzamentos no banco de dados e o Power BI não conseguiu se conectar à base de dados.

Existe importação de chaves primárias e estrangeiras definidas no banco de dados?

Não foram realizados testes na base de dados e o Power BI não conseguiu se conectar ou consumir dados da base.

Conclusões

O DuckDB se mostrou pouco maduro quanto a capacidades de integração com as ferramentas analisadas. Também há pouco material disponível a respeito do assunto. Se mostrou muito veloz para leitura das bases durante a carga de dados e possui grande integração com o pacote Pandas do Python. Todavia, os problemas de integração com ferramentas de BI se monstraram um impeditivo para seu uso em projetos que visem usuários finais consumindo seus dados, ao menos no momento atual.

SQlite:

Código da carga de dados: https://github.com/splor-mg/sqlite-carga-despesa

As ferramentas de BI conseguiram conectar e consumir os dados?

Sim. Porém o driver open source inicialmente utilizado não funcionou, apresentado o erro relatado neste issue. O driver proprietário Devart for SQLite foi testado e conseguiu se conectar e importar os dados corretamente.

Quais dependências precisam ser instaladas?

pandas==1.5.2
ckanapi==4.0
Devart ODBC Driver for SQLite

As colunas são importadas com os tipos corretos?

Sim.

O cruzamento entre tabelas acontece na ferramenta de BI ou no banco de dados?

O Power BI conseguiu se conectar à base de dados e identificou os relacionamentos entre as tabelas automaticamente (apenas faltando duas, relatadas o próximo tópico). Não foram feitos testes cruzamentos no banco de dados ainda por esta avaliação.

Existe importação de chaves primárias e estrangeiras definidas no banco de dados?

Duas tabelas da base de dados, dm_situacao_op_desp e fl_desp_pgto, não tiveram seus relacionamentos automaticamente detectados, o que indica que pode se tratar do caso de chaves estrangeiras que não estão definidas no banco e não foram detectadas pelo Power BI.

Conclusões

O SQLite é um banco largamento utlizando e possui uma grande comunidade e conteúdo disponível. Sua capacidade de importações e leitura das bases não se demonstrou um problema. Mesmo com tal maturidade, o fato de apenas o driver ODBC proprietário ter funcionado pode comprometer seu uso no projeto caso seja necessário consumo de dados por usuários finais.

Postgres:

Código: https://github.com/splor-mg/postgresql-carga-despesa#uso

As ferramentas de BI conseguiram conectar e consumir os dados?

Sim. O Power BI possui integração nativa com o Postgres e inclusive possui a opção de directQuery, não sendo necessário importar os dados para o Power BI, sendo as consultas realizadas diretamente no servidor do Postgres.

Quais dependências precisam ser instaladas?

pandas==1.5.2
ckanapi==4.04.0
SQLAlchemy==2.0.11
psycopg2==2.9.6
Docker 20.10.22, build 3a2c30b e container do projeto

As colunas são importadas com os tipos corretos?

Sim.

O cruzamento entre tabelas acontece na ferramenta de BI ou no banco de dados?

O Power BI reconheceu os relacionamentos entre as tabelas automaticamente. Não foram realizados testes de cruzamento na base de dados.

Existe importação de chaves primárias e estrangeiras definidas no banco de dados?

Duas tabelas da base de dados, dm_situacao_op_desp e fl_desp_pgto, não tiveram seus relacionamentos automaticamente detectados, o que indica que pode se tratar do caso de chaves estrangeiras que não estão definidas no banco e não foram detectadas pelo Power BI.

Conclusões

Diferente do DuckDB e SQLite, o Postgres possui uma arquitetura de banco de dados clássica de cliente-servidor, o que exige uma configuração de dependências maior e gestão desse servidor. Seu desempenho (tempo) para importação de dados foi o pior até o momento (cabe ainda investigação de nossa parte quanto outras formas de importação de dados). Apesar disso, é o banco com maior integração com as ferramentas de BI avalidas, já possuindo métodos nativos de conexão. O PgAdmin parece oferecer uma gama de recursos de gestão de SGDB que possibilitariam bancos de dados de maior volume e resilientes com o passar do tempo.

Pendências

  • Realizar testes de chaves primárias e estrangeiras sendo importadas corretamente nos bancos DuckDB, SQLite e Postgres
  • Buscar drivers odbc gratuitos para o SQLite
  • Buscar outros drivers ODBC ou formas de conexão do DuckDB com o Power BI (abrir issue no git oficial do projeto)
  • Entender o funcionamento das tabelas dm_situacao_op_desp e fl_desp_pgto para verificar se é questão de chaves estrangeiras não reconhecidas pelo Power BI.
  • Investigar lentidão de carga de dados do Postgres. Verificar se pandas + SqlAlchemy foi usado de maneira ineficiente ou utilizar leitura de csv nativa do Python e comparar.

@labanca
Copy link

labanca commented Jun 27, 2023

Tentando atender ao issue https://github.com/splor-mg/reestimativa-dados/issues/4 encontrei a seguinte informação:

Using Python with Power BI introduces a whole new set of possibilities for working with data. Python turns Power BI into a platform that can do almost anything.

Here are a few examples of the types of tasks that can be performed with Python in Power BI:
[...]

  • Connectivity - Python gives you the ability to connect to almost any data source even if Power BI does not support it as one of its own built-in connections.

Que pode ser útil para conectar fontes de dados não suportadas a princípio, como o caso do SQLite e outras.

[Verificar] Ao que tudo indica, execução de scripts Python no Power BI tem acesso apenas local, não podendo se conectar a bases remotas.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants