問題タブ [dbix-class]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - DBIx::Class - 読み取り専用の合成カラム (SQL で定義) を結果クラスに追加しますか?
「合成された」列を DBIx::Class 結果クラスに追加することは可能ですか? 合成された列の値は、現在の行の SQL 式によって定義されます。たとえば、行に と の列がある場合、定義が (これは Oracle SQL 構文です) である新しい読み取り専用のfirst
列last
を合成でき \"me.first || ' ' || me.last"
ます。
DBIx::Class ドキュメントの "COMPUTED COLUMNS" の下に、私が望むものに近いものがリストされています。ただし、その場合、列はデータベース側で既に定義されているようです。合成された列がテーブル スキーマにありません。
SELECT
それができない場合、結果セットを検索するときに生成されたステートメントにSQL 式を追加することはできますか?
(上記の SQL の例は誤解を招くものです。データベース関数を含む SQL 式を実行する必要があるため、perl だけで実装することはできません。)
postgresql - Postgres を使用した DBIx::Class でクエリごとに準備済みステートメントを無効にする
Postgres で準備されたステートメントを使用すると、はるかに遅いクエリがいくつかあります (これは既知の問題です。 http://www.postgresql.org/docs/current/static/sql-prepare.htmlを参照してください)。したがって、これらのクエリのステートメント準備をオフにしたいと考えています。
DBIx::Class では、connect_info でパラメータ「pg_server_prepare => 0」を渡すことにより、データベースに接続するときにプリペアド ステートメントをグローバルにオフにすることができます。しかし、既存の接続に対してこれを変更する方法がわかりません。DBIx::Class::Schemaが与えられたので、私はこれを試しました:
その呼び出しの後に connect_info をログに記録すると、このパラメーターの新しい値が表示されますが、データベース ドライバーはまだプリペアド ステートメントを使用しています。私も切断して再接続しようとしました
しかし、これも役に立ちませんでした。
何か案は?
sql - DBIx::Class はユニオンを行いますか?
ビューを使用して手動で SQL を書き出す以外に、 DBIx::Classでユニオンを行う方法を見つけられませんでした。これは私には奇妙に思えます。セットの加算と減算は SQL の中核部分であるため、余分な作業をせずに 2 つの ResultSet を結合する何らかの方法が必要だと思います。ユニオンを行う簡単な方法はありますか? そうでない場合、なぜですか?
perl - DBIx :: Class-この関係はどこにキャッシュされていますか?
OrderエンティティとAddressエンティティがあり、Schema::Result::Order
モジュールには単純な所属関係があります。
私はこのコードを次のように実行しますDBIC_TRACE=1
:
クエリは1つしか表示されないSELECT ... FROM ADDRESS ...
ため、2番目の$order->address
メソッドはデータベースにアクセスしていないようです。
したがって、これは簡単な質問かもしれませんが、アドレスオブジェクトはどこにキャッシュされますか?($order
オブジェクト内?)
次に、このキャッシュは構成可能ですか(つまり、これらの関係をキャッシュしないようにDBICを構成できますか)。
sql - DBIx :: Class:リスト内の値の存在に基づく結果セットorder_by
DBIx :: Classを使用していて、ResultSetを取得しています。ResultSetを並べ替えるのが好きです。特定の列「City」を値の修正リスト(「London」、「New York」、「Tokyo」)と照合するのが好きです。値のリストに都市が見つかった場合、その結果をトップグループに移動します。都市が見つからない場合は、その結果をResultSetの一番下のグループに移動します。
sql - 別のテーブルに従ってテーブルを並べ替える
テーブルAがあります。
および表 B
テーブルAをソートする必要があります。
ソート順:
最終出力:
これは DBIx::Class クエリに変換する必要があります。
私は次のことを試しました:
しかし、tableB.S が '7' である結果を取得する場所がありません。
ありがとう。
sql - SQL 変換
適切に機能するクエリがあります
p>左結合では、1 つの条件 ( A.id = B.id) のみを配置できます。したがって、B.country = 'USA' の部分を別の場所に配置する必要があります。回避策はありますか?サブクエリを使用できます。
更新: スキーマで単一の条件 (ID マッチング) を定義したフレームワーク (DBIx::Class) を使用する必要があり、それを変更するのは簡単ではありません。
perl - DBIx::Class find_or_create エラー - でクラス メソッドとしてデータを取得できません
次のスキーマがあります。
find_or_create
次のようないくつかの属性に基づいて注文しようとしています。
そして、私はエラーが発生しますDBIx::Class::Row::get_column(): Can't fetch data as class method
status
ここで、列を から除外すると、find_or_create
期待どおりに機能します (ただし、必要に応じてではありません。そのため、句に列を追加する必要があります)。
に他の列を追加すると、find_or_create
そのエラーが発生します。
find_or_create
これがバグなのか、それとも予想される動作なのか、また、より多くの列の値に基づいて注文する方法を知っている人はいますか?
編集:
バグではないようです-new
メソッドを適切な方法でオーバーライドしていませんでした。
new
メソッドは次のようにする必要があります。
「数」時間のデバッグの後、私はそれを修正することができました。
時間をかけて読んで、なぜこれがうまくいかなかったのかを理解しようとしてくれたすべての人に感謝します.
perl - TemplateToolkitからCatalystへのロジックの移動
TTテンプレートで使用している条件と計算が多すぎると思います。
DBIcからのアイテムの結果セットを表示しています。アイテムごとに、取得した値を使用して計算する必要がありますが、テンプレートが適切な場所ではないようです。
しかし、Catalystでは、DBIcに由来する厚いオブジェクトです。
では、どうすればロジックをモデルに移動できますか?すべてのアイテムに対してループ全体を実行し、オブジェクトを何らかの方法で変更する必要がありますか?
よろしく:Migue、