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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

2133閲覧

goのGORMを利用して、同じテーブル構造をしている複数のテーブルの名前を取得したい

ratte_108

総合スコア13

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/12/25 04:47

前提・実現したいこと

初学者です。

現在操作しているDBに"data_%"というテーブル名が複数存在しており、
goのGORMを利用してそれらの名前を全て取得したいと考えております。

テーブルの中身は全て同じ構造になっているため、
とりあえず以下のようなモデルを定義してインスタンス化し、テーブル名を取得出来ないか見てみましたがわかりませんでした。

type Data struct { ID int Name string Age int }

初歩的な質問で申し訳ありませんが、方法等ご教授いただけますと幸いです。
何卒よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

  • postgres:11.1
  • golang:1.9
  • Gorm

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

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

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

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

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

guest

回答2

0

名前をすべて取得するには、システムカタログのpg_tablesからテーブル名を取得することになると思います。
pg_stat_user_tables(表28.2 収集済み統計情報ビュー)を使用した方が簡潔にはなります。
テーブル一覧およびコメント表示SQL

取得したテーブル名を元にUNIONクエリーを動的に組み立てそのSQLを発行すればデータ構造を変更する必要は無いと思います。

ですが、テーブル構造が同じというなら、パーティションとするのも検討されては如何ですか。
パーティショニング : 用途と利点
5.10. パーティショニング

投稿2018/12/25 05:24

sazi

総合スコア25173

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

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

ratte_108

2018/12/25 10:07

こちらの説明が足りておらず、誠に申し訳ありません。 テーブルのパーテショニングは既に出来ており、条件に合うテーブルに対しての操作をしたかったです。 なので、sazi様の仰った通り pg_stat_user_tables を使う方法でテーブル一覧を取得することが出来、目的を達成することが出来ました。 丁寧にご教授いただき、誠にありがとうございました。
guest

0

ベストアンサー

Goではなく、SQLでSELECTしますが、pg_attribute から、attname : 列名、atttypid : データ型、必要によって atttypmod : 桁数 から[同じテーブル構造]かを判断できるのでは?

追記

pg_tables を使っては?

SQL

1SELECT schemaname, tablename FROM pg_tables WHERE schemaname = 'XXXXX' AND tablename LIKE 'data_%'

投稿2018/12/25 05:24

編集2018/12/25 09:04
Orlofsky

総合スコア16415

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

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

ratte_108

2018/12/25 07:46 編集

ご回答いただきありがとうございます。 また、こちらの説明が不足していたために意図をうまく伝えられず、誠に申し訳ありませんでした。 こちらが本当にしたいと考えていたことは、 『goのソースからDBの指定したテーブルを削除したい』で、 その過程で、『GORMを使用し、[同じテーブル構造]のテーブルの名前を取得したい』 というところで詰まっておりました。 DBに入っている[同じテーブル構造]の名前は、 data_1 data_2 data_3 ・ ・ ・ というようになっており、 現在作成していたソースの流れは、 1.定義ファイルを読み込み、削除したいテーブルの範囲を取得(ex. data_2 以降全て) 2.現在のDBの data_% のテーブルの名前を取得 3.1と2で取得した情報をもとに、削除したいテーブルの名前を文字列で作成 4.3で作成したテーブルの名前の文字列を 下記の関数に順に与えて削除していく ``` var data string // 2で作成した文字列 if err := db.Where(db.DropTableIfExists(data)).Error; err !=nil{ // error handling... } ``` となっており、 その中の上記の 2 の方法がわからずに詰まっておりました。 よろしくお願い致します。
Orlofsky

2018/12/25 09:05

回答を追記しました。
ratte_108

2018/12/25 10:08 編集

申し訳ありません、Orlofsky様の仰った方法でテーブルの名前を取得することが出来、こちらの目的を達成することが出来ました。 ご教授いただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問