質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

Q&A

解決済

1回答

955閲覧

Julia言語で文字列が含まれるSQLiteのテーブルをDataFrameに格納した時にエラーが発生したことについて

ujimushi_sradjp

総合スコア2091

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

0グッド

0クリップ

投稿2021/12/03 14:27

Julia言語で文字列が含まれるSQLiteのテーブルをDataFrameに格納した時にエラーが発生したことについて

私はJulia言語を今年の2月から始めたものです。

この数ヵ月で発生した変な現象について質問に記載し,
どのように解決したか他の人の参考のためにここに残しておきたいと思います。

SQLiteパッケージで文字列(text)が含まれるテーブルをDataFrameに格納しようとした時にエラーが発生しました。
エラーが発生するプログラムの例を次に示します。

julia

1using SQLite 2using DataFrames 3 4db = SQLite.DB("test.db") 5df = DBInterface.execute(db, "SELECT * FROM test") |> DataFrame 6 7println(df)

エラー表示を次に示します。

julia> include("test.jl") ERROR: LoadError: MethodError: promote_type(::Type{Union{}}, ::Type{String}) is ambiguous. Candidates: promote_type(::Type{Union{}}, ::Type{T}) where T in Base at promotion.jl:224 promote_type(::Type{T}, ::Type{String}) where T<:WeakRefStrings.InlineString in WeakRefStrings at /home/ujimushi/.julia/packages/WeakRefStrings/a3jYm/src/inlinestrings.jl:44 Possible fix, define promote_type(::Type{Union{}}, ::Type{String}) Stacktrace: [1] add_or_widen!(val::String, col::Int64, nm::Symbol, dest::Tables.EmptyVector, row::Int64, updated::Base.RefValue{Any}, L::Base.SizeUnknown) @ Tables ~/.julia/packages/Tables/OWzlh/src/fallbacks.jl:150 [2] eachcolumns @ ~/.julia/packages/Tables/OWzlh/src/utils.jl:127 [inlined] [3] _buildcolumns(rowitr::SQLite.Query, row::SQLite.Row, st::Int64, sch::Tables.Schema{(:id, :name), nothing}, columns::Tuple{Tables.EmptyVector, Tables.EmptyVector}, updated::Base.RefValue{Any}) @ Tables ~/.julia/packages/Tables/OWzlh/src/fallbacks.jl:187 [4] buildcolumns @ ~/.julia/packages/Tables/OWzlh/src/fallbacks.jl:217 [inlined] [5] columns @ ~/.julia/packages/Tables/OWzlh/src/fallbacks.jl:253 [inlined] [6] DataFrame(x::SQLite.Query; copycols::Nothing) @ DataFrames ~/.julia/packages/DataFrames/vuMM8/src/other/tables.jl:58 [7] DataFrame @ ~/.julia/packages/DataFrames/vuMM8/src/other/tables.jl:49 [inlined] [8] |>(x::SQLite.Query, f::Type{DataFrame}) @ Base ./operators.jl:858 [9] top-level scope @ ~/test.jl:5 [10] include(fname::String) @ Base.MainInclude ./client.jl:444 [11] top-level scope @ REPL[4]:1 in expression starting at /home/ujimushi/test.jl:5

Juliaのバージョンは1.6.4(1.6.3や1.6.2でも再現)で,インストールしているパッケージは次の通りです。

(@v1.6) pkg> status Status `~/.julia/environments/v1.6/Project.toml` [15f4f7f2] AutoHashEquals v0.2.0 [ad839575] Blink v0.12.5 [336ed68f] CSV v0.8.5 [a93c6f00] DataFrames v1.2.2 [28b8d3ca] GR v0.62.1 [945b72a4] MarketData v0.13.7 [58dd65bb] Plotly v0.4.1 [a03496cd] PlotlyBase v0.8.18 [f0f68f2c] PlotlyJS v0.18.8 [91a5bcdd] Plots v1.25.0 [0aa819cd] SQLite v1.3.0 [9e3dc215] TimeSeries v0.23.0 [ea10d353] WeakRefStrings v1.1.0

このエラーの原因と解決方法を調査して解決しました。回答に示します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

このエラーの原因は,WeakRefStringsパッケージのバージョンが1.2.何とかより古いことに起因します。

ところが,

(@v1.6) pkg> status Status `~/.julia/environments/v1.6/Project.toml` [15f4f7f2] AutoHashEquals v0.2.0 [ad839575] Blink v0.12.5 [336ed68f] CSV v0.8.5 [a93c6f00] DataFrames v1.2.2 [28b8d3ca] GR v0.62.1 [945b72a4] MarketData v0.13.7 [58dd65bb] Plotly v0.4.1 [a03496cd] PlotlyBase v0.8.18 [f0f68f2c] PlotlyJS v0.18.8 [91a5bcdd] Plots v1.25.0 [0aa819cd] SQLite v1.3.0 [9e3dc215] TimeSeries v0.23.0 [ea10d353] WeakRefStrings v1.1.0

のパッケージの組み合わせではupdateしてもWeakRefStrings1.1のままです。

この原因を調査したところ,
MarketDataパッケージの依存関係は下記のProject.tomlファイルのように
CSVのパッケージが0.8までしか対応していないと記述されており
CSVの0.8はWeakRefStringsの古いバージョンしか対応していない,
ということのようです。

yaml

1name = "MarketData" 2uuid = "945b72a4-3b13-509d-9b46-1525bb5c06de" 3authors = ["JuliaQuant <https://github.com/JuliaQuant>"] 4version = "0.13.7" 5 6[deps] 7CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" 8Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" 9HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" 10Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 11Reexport = "189a3867-3050-52da-a836-e630ba90ab69" 12TimeSeries = "9e3dc215-6440-5c97-bce1-76c03772f85e" 13 14[compat] 15CSV = "0.7, 0.8" 16HTTP = "0.8, 0.9" 17Reexport = "0.2, 1.0" 18TimeSeries = "0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23" 19julia = "1"

ここでWeakRefStringsのバージョンを上げる方法は2つあり,1つは

(@v1.6) pkg> add WeakRefStrings@1.4.1

とする方法です。これを行うとWeakRefStringsのバージョンを1.4.1と指定して
パッケージの依存関係を解決するというものです。

ただし,かなりのパッケージのバージョンが古い状態になります。

もう一つは,

(@v1.6) pkg> develop MarketData (@v1.6) pkg> update

とするものです。

これは,MarketDataのGitHubの最新ソースにはCSVv0.9も追加されているためで,
これを無理やり開発パッケージとして最新を適用することで
CSV v0.9WeakRefStrings v1.4
となるものです。

今のところこれが有力ですが,MarketDataのGitHub最新で直っているということは
いずれこの問題もなくなるということです。

もちろん,MarketData(共依存関係にあるTimeSeriesも関係するかもしれません)パッケージを
addしていない環境だとこの変な不具合は発生しないということになります。

一応問題解決の参考例として。

投稿2021/12/03 14:29

ujimushi_sradjp

総合スコア2091

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問