データ API ビルダーでの MySQL の接続、認証、データ型に関する一般的な問題の解決策。
一般的な質問
DAB での MySQL サポートとは
データ API ビルダーは、MySQL をリレーショナル データベース バックエンドとしてサポートします。 DAB は MySqlConnector ドライバーを使用して接続し、REST 要求と GraphQL 要求を SQL クエリに変換します。 セルフホステッド MySQL インスタンスと、Azure Database for MySQL などのマネージド サービスの両方がサポートされています。
MySQL ではどのような接続文字列形式が使用されますか?
DAB では、標準の MySQL ADO.NET 接続文字列が使用されます。 一般的な文字列は Server=localhost;Port=3306;Database=mydb;Uid=myuser;Pwd=mypassword;のようになります。
data-source.connection-stringのdab-config.jsonフィールドに接続文字列を設定するか、--connection-stringのdab init経由で渡します。
どの MySQL バージョンがサポートされていますか?
DAB では、MySQL 8.0 以降がサポートされています。 MySQL 5.7 は機能する可能性がありますが、公式にはサポートされていません。 MySQL シェルで SELECT VERSION(); を使用して、サーバーのバージョンを確認します。 Azure Database for MySQL などのマネージド サービスを使用している場合は、MySQL 8.0 をサポートするフレキシブル サーバー層を使用します。
一般的な問題
MySQL コンテナーに接続できません
症状: DAB は、 Unable to connect to any of the specified MySQL hostsで開始できません。
原因: MySQL コンテナー ポートがマップされていないか、ホスト名が間違っているか、コンテナーの初期化が完了していません。
解像 度: コンテナーが docker ps で実行されており、ポート 3306 がホストにマップされていることを確認します。 接続文字列で Server=localhost;Port=3306 を使用します。 DAB を開始する前に MySQL の初期化が完了するまで、コンテナーの起動後数秒を許可します。
ユーザーに対してアクセスが拒否されました
症状: DAB ログには、 Access denied for user 'myuser'@'172.x.x.x' または同様の情報が表示されます。
原因: MySQL ユーザー アカウントは、特定のホストに制限されます。 DAB が Docker で実行されている場合、接続は localhostではなく、コンテナー ネットワーク IP から送信されます。
解像 度:GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES;を実行して、任意のホストからのアクセス権をユーザーに付与します。 運用環境では、 % を特定のホストまたはサブネットに置き換えます。 同じネットワークから mysql -u myuser -p を実行して、パスワードが一致するかどうかを確認します。
不明なデータベース エラー
症状: DAB は起動時に Unknown database 'mydb' を返します。
原因: 接続文字列で指定されたデータベースが MySQL サーバーに作成されていません。
解像 度: MySQL シェルで CREATE DATABASE mydb; を実行して、DAB を開始する前にデータベースを作成します。 コンテナーを使用する場合は、最初の起動時に MySQL によってデータベースが作成されるように、 MYSQL_DATABASE 環境変数を設定します。
サポートされていない列の種類の警告
症状: DAB は、サポートされていない列の種類に関する警告をログに記録し、生成されたスキーマにフィールドがありません。
原因:SET、ENUM、空間型など、特定の MySQL 固有の型は、DAB の型システムで直接マッピングされない場合があります。
解像 度: DAB ログを確認して、列と種類を特定します。
VARCHAR フィールドのENUMなどのサポートされている型に列を変更するか、mappings構成を使用してエンティティ定義から列を除外して、公開されたスキーマから列を省略することを検討してください。
ビューの更新が失敗する
症状: MySQL ビューによってサポートされるエンティティに対する PUT または PATCH 要求がエラーで失敗するか、影響を及ぼすわけではありません。
原因: データ API ビルダーは現在、MySQL ビューの更新操作をサポートしていません。 これは、 GitHub の問題 #938 で追跡されている既知の制限です。
解像 度: 書き込み操作にはベース テーブル エンティティを使用します。 ビューが仕様によって読み取り専用の場合は、エンティティのアクセス許可で "update": false を設定して、制限を明示的にします。
計算列を含むテーブルの更新が失敗する
症状: 計算列を含む MySQL テーブルに対する PUT または PATCH 要求が失敗するか、エラーを返します。
原因: データ API ビルダーは、MySQL の更新操作中に計算列を正しく処理しません。 これは、 GitHub の問題 #1001 で追跡されている既知の制限です。
解像 度: 現時点では回避策はありません。 可能であれば、エンティティのマッピングから計算列を除外するか、問題が解決されるまで影響を受けるエンティティに対する更新操作を回避します。
入れ子になったフィルター処理はサポートされていません
症状: 関連エンティティ フィールドをフィルター処理する REST \ または GraphQL ilter クエリは、MySQL でサポートされるエンティティに対してエラーまたは予期しない結果を返します。
原因: データ API ビルダーは現在、MySQL の入れ子になったフィルター処理をサポートしていません。 これは、 GitHub の問題 #1019 で追跡されている既知の制限です。
解像 度: 最上位レベルのエンティティ フィールドにのみフィルター処理を適用します。 入れ子になったデータの場合は、親を取得してクライアント側をフィルター処理するか、入れ子になった述語を回避するためにクエリを再構築します。
ストアド プロシージャはサポートされていません
症状: MySQL ストアド プロシージャをエンティティ ソースとして構成できないか、エンティティが期待どおりに動作しません。
原因: データ API ビルダーは現在、MySQL のストアド プロシージャをサポートしていません。 これは、 GitHub の問題 #1024 で追跡されている既知の制限です。
解像 度: 代わりに、エンティティ ソースとしてテーブルまたはビューを使用します。 MySQL ストアド プロシージャのサポートが追加されたときの更新については、GitHub の問題に従ってください。
作成操作にデータベース ポリシーが適用されない
症状: データベース ポリシーで操作を制限する必要がある場合でも、作成の変更または POST 要求は成功します。
原因: MySQL での作成アクションに対するデータベース ポリシーのサポートはまだ実装されていません。 これは、 GitHub の問題 #1329 で追跡されている既知の制限です。
解像 度: ロールベースのアクセス許可を使用して、MySQL 作成に対するデータベース ポリシーのサポートが利用可能になるまで、作成アクセスを制限します。
PUT および PATCH 操作に対してデータベース ポリシーが適用されない
症状: MySQL エンティティに対する PUT または PATCH 要求は、データベース ポリシーで制限する必要がある場合でも成功します。
原因: MySQL での PUT 操作と PATCH 操作に対するデータベース ポリシーのサポートはまだ実装されていません。 これは、 GitHub の問題 #1371 で追跡されている既知の制限です。
解像 度: ロールベースのアクセス許可を使用して、MySQL 更新操作に対するデータベース ポリシーのサポートが利用可能になるまで更新アクセスを制限します。
On-Behalf-Of (OBO) 認証はサポートされていません
症状: MySQL ベースの DAB インスタンスに対するオンBehalf-Of (OBO) 認証の構成が失敗するか、トークンが想定どおりにデータベースに転送されません。
原因: OBO 認証は現在、SQL Server と Azure SQL でのみサポートされています。 MySQL のサポートはまだ実装されていません。 これは、 GitHub の問題 #3159 で追跡されている既知の制限です。
解像 度: MySQL の接続文字列資格情報など、サポートされている認証方法を使用します。 OBO サポートが SQL Server 以外のデータベースに拡張される場合の更新については、GitHub の問題に従ってください。