20210728のMySQLに関する記事は7件です。

Cannot delete or update a parent row: a foreign key constraint failsの対処

ユーザーアカウントの削除をしようとしたところ、件名のエラーが発生したためその対処法を書いておきます。 Rubyを使っている場合の対処法が多くあったのですが、TypeORM、NestJSでの対処法が日本語で少なかったため、 同じエラーが出たときに見返すために残しておきます。 エラー内容 Cannot delete or update a parent row: a foreign key constraint fails 原因 こちらの記事がうまくまとめてあったのでこの通りです。 解決方法 今回usersテーブルを親テーブル、commentsテーブルが子テーブルの関係に当たりました。 それぞれの構造を以下のように変更しています。 users.entity.ts @Entity('users') export class Users extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column({ nullable: true, unique: true }) @Generated('uuid') //ユーザーのuuid,不変,テーブルの連携に使う user_uuid: string; @Column({ unique: true }) //ユーザーid,変更可能,@以下のid user_id: string; @Column({ nullable: true ,default:"名無さん"}) user_name: string; @Column({ unique: true }) email: string; @Column() password: string; @Column({ nullable: true }) //自己紹介文 self_introduction: string; @Column({ default: 0 }) follow_count: number; @Column({default:false})     is_followed: boolean; @Column({ default: 0 }) follower_count: number; @CreateDateColumn({ nullable: true }) created_at: Date; @UpdateDateColumn({ nullable: true }) updated_at: Date; //cascadeをtrueに設定 @OneToMany(() => Comments, (coments: Comments) => coments.user,{cascade:true}) comments: Comments[]; cascadeをtrueに設定しておきます。 ただこのままだとまだ件名のエラーは解消されないので子テーブルを変更します。 comments.entity.ts @Entity('comments') export class Comments extends BaseEntity { @PrimaryGeneratedColumn() comments_id: number; @Column({ nullable: false }) //投稿内容 comment: string; @Column({ nullable: true }) //返信先のコメントのid return_id: number; @Column({ default: 0 }) //投稿に返信されたコメントの数 return_count: number; @Column({ default: 0 }) favorite_count: number; @CreateDateColumn() created_at: Date; @UpdateDateColumn() updated_at: Date; @ManyToOne(() => Users, (user) => user.comments, { nullable: false, onDelete:"CASCADE", orphanedRowAction: "delete" }) //nameでcolumn=user_uuidを作成、referencedcolumnNameでusersのテーブルからuser_uuidのカラムを引用 @JoinColumn({ name: 'user_uuid', referencedColumnName: 'user_uuid' }) user: Users; } ManyToOneのonDeleteをCASCADEに設定するとユーザーアカウンをを削除する際エラーが発生しなくなりました。 *補足 今回のこととは関係ありませんが、子テーブルのManyToOne内のorphanedRowAction: "delete"に設定してをくとユーザーを削除したときにcommentも同時に削除してくれます。 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのキューアプリをDockerでサクっと構築

LaravelのキューアプリをサクっとDocker化したい、そんな記事です。 前置き Docker化に重きを置きたいので、ジョブ実装などには触れません。 (実装まで触れるともう記事が長いってば!になっちゃう) キューはMySQL、workerのデーモン化はsupervisordを採用します。 バージョン PHP / Laravel: 8系 MySQL: 5.7系 やってみよう さっそくですが、以下がディレクトリ構成です。 project |- docker | |- app // laravelアプリケーションのDockerfile など | |- mysql // docker-entrypoint-initdb.d など | |- supervisord // supervisordのDockerfile など | └ docker-compose.yml └ app // 以下ソースコード ... 各ディクトリ中身について触れていきます。 appディレクトリ app |- Dockerfile └ httpd.conf LaravelアプリケーションのDockerビルド関連のディレクトリです。 今回はapacheを採用、Dockerfileは以下。 centosベースにphpなど必要なものをインストールしていく。 FROM centos:centos7 RUN yum -y update && yum -y install \ https://repo.ius.io/ius-release-el7.rpm \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \ https://rpms.remirepo.net/enterprise/remi-release-7.rpm \ yum-utils \ git \ unzip \ curl \ && yum-config-manager --disable "remi-php*" \ && yum-config-manager --enable remi-php80 \ && yum clean all RUN yum -y install --enablerepo=remi,remi-php80 \ httpd24u \ php \ php-mbstring \ php-mcrypt \ php-pdo \ php-mysqlnd \ php-opcache \ php-process \ php-xml RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer COPY httpd.conf /etc/httpd/conf.d/httpd.conf WORKDIR /var/www/html ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"] mysqlディレクトリ mysql └ docker-entrypoint-initdb.d └ init.sql 初期で作成するテーブル情報などを記載したsqlファイルを用意。 僕の場合、このsqlファイルにキューで使うjobsテーブル、failed_jobsテーブルのCREATE文もまとめています。 (公式ドキュメントでは、php artisan queue:table && php artisan migrate でテーブル生成してくれますので、このコマンドを使うってのも一つかと思いますがなんだかめんどくさそう) supervisordディレクトリ supervisord |- Dockerfile |- job-worker.conf └ supervisord.conf jobを消化するworkerをデーモン化(キューを常に監視)する必要があり、その役割がsupervisordです。 (ちなみに、supervisordはLaravel公式ドキュメントでもデーモン化の一つの手段として言及されています) 「Laravelアプリがjobをキューへプッシュ → workerがキューからjobを取り出す」的な構成の、後者にあたるものがこのコンテナになります。 job-worker.confはworkerの動作設定を記述したファイル、supervisord.confはsupervisord全体の設定ファイルになります。 ここでは特に載せません、必要に応じてググってください。(Laravel公式ドキュメントにもヒントレベルのものなら載っています) ここでのDockerfileは以下になります。 FROM centos:centos7 RUN yum -y update && yum -y install \ https://repo.ius.io/ius-release-el7.rpm \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \ https://rpms.remirepo.net/enterprise/remi-release-7.rpm \ yum-utils \ git \ unzip \ curl \ && yum-config-manager --disable "remi-php*" \ && yum-config-manager --enable remi-php80 \ && yum clean all RUN yum -y install --enablerepo=remi,remi-php80 \ php \ php-mbstring \ php-mcrypt \ php-pdo \ php-mysqlnd \ php-opcache \ php-process \ php-xml RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN yum -y install supervisor RUN mkdir -p /var/log/supervisor COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY job-worker.conf /etc/supervisor/conf.d/job-worker.conf CMD bash -c "/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf && /bin/bash" 今回はworkerを別コンテナで立ち上げたため、Larabelアプリコンテナと同様にPHPのインストールが必要になります。 docker-compose.yml そして最後ですね。 docker-compose.yml version: '3.8' services: app: build: ./app image: app:latest container_name: app working_dir: /var/www/html ports: - 8000:80 volumes: - /path/to/project-root/:/var/www/html/ supervisord: build: ./supervisord image: supervisord:latest container_name: supervisord tty: true volumes: - /path/to/project-root/:/var/www/html/ depends_on: - app mysql: image: mysql:5.7.32 container_name: mysql environment: MYSQL_ROOT_PASSWORD: root volumes: - ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d ports: - 3306:3306 最後に こんな感じでサクッと。 とりあえずローカルでーとかってパターンなら、これで十分かなーと思います。 また気が向けば、別記事でジョブ実装やらsupervisordやらのこと書こうかなーと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】アプリ 新規作成 サーバー起動 手順

新規アプリ作成〜サーバー起動までを最短で行う方法を記述してます 環境 Ruby 3.0.2 Rails 6.1.4 MySQL 5.6 ※環境を合わせると、エラー最小限で進められると思います 新規アプリ作成 MySQLを使用する場合 $rails new <アプリ名を記入> -d mysql sqlite3を使用する場合 $rails new <アプリ名を記入> データベース設定 config/database.ymlで以下を設定する database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root ←MySQLのユーザー名がrootでない場合は変更する password: "<MySQLのパスワードを記入>" socket: /tmp/mysql.sock development: <<: *default database: <アプリ名>_development データベース作成 以下のコマンドを実行 $ rails db:create 以下が表示されればOK Created database '<アプリ名>_development' Created database '<アプリ名>_test' サーバー起動 ①以下のコマンドを実行 $ rails s ②GoogleCrome等で、localhost:3000を開いて、以下の画面が表示されれば完璧 参考資料 備考 最短で起動したかったので、自分で記事を作成してみました。 不備などあれば教えていただけますと助かります
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActiveRecord::NoDatabaseError

環境 Ruby 3.0.2 Rails 6.1.4 事象 以下を実行するとエラーが表示された。 ①新規Railsアプリを作成(rails new) ②サーバーを起動(rails s) ③config/database.ymlにMySQLの接続情報を追記 ④localhost:3000を開く ActiveRecord::NoDatabaseError 解決策 以下を実行。 rails db:create 「データベースがないよ」というエラーなので、データベースを作ってあげればOK サーバーを再起動後にリロードしたら、Railsのデフォルト画面が表示されました 参考資料
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

XAMPPのMariaDBでエラー「InnoDB: Table `mysql`.`innodb_table_stats` not found.」を見つけたので修正した

概要 "XAMPP 8.0.7"の"MariaDB 10.4.19"にて次のエラーログを見つけた。MySQL5.6のバグのよう。 [ERROR] InnoDB: Table `mysql`.`innodb_table_stats` not found. 修正方法 1.rootでログインしてdrop tableをする # mysql -h127.0.0.1 -uroot -pパスワード mysql > use mysql; mysql > drop table innodb_index_stats; mysql > drop table innodb_table_stats; mysql > drop table slave_master_info; mysql > drop table slave_relay_log_info; mysql > drop table slave_worker_info; mysql > quit; 2.MySQLを停止させる xampp-controlからポチポチ 3.ファイルを削除する # cd C:\xampp\mysql\data\mysql # rm -rf innodb_index_stats* # rm -rf innodb_table_stats* # rm -rf slave_master_info* # rm -rf slave_relay_log_info* # rm -rf slave_worker_info* 4.MySQLを起動させる xampp-controlからポチポチ 5.rootでログインしてテーブル作成 リンク先: https://bugs.mysql.com/file.php?id=19725&bug_id=67179&text=1 # mysql -h127.0.0.1 -uroot -pパスワード mysql > use mysql; mysql > リンク先のクエリを流す mysql > quit; 6.mysql_upgradeをする mysql_upgrade -u root -p Enter password: ******** 参考にしたサイト Error: Table "mysql"."innodb_table_stats" not found.のバグに対応する MariaDB:MariaDB のログに「 InnoDB: Error: Table “mysql”.”innodb_table_stats” not found. 」と出てた時の対処方法 Qiita: MariaDBとMySQL のバージョン比較
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActiveRecord::ConnectionNotEstablished【MySQL】

環境 Ruby 3.0.2 Rails 6.1.4 事象 以下を実行するとエラーが表示された。 ①新規Railsアプリを作成(rails new) ②サーバーを起動(rails s) ③localhost:3000を開く。 ActiveRecord::ConnectionNotEstablished 解決策 config/database.ymlでパスワードを設定 default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: "<パスワード>" socket: /tmp/mysql.sock development: <<: *default database: <アプリ名>_development この後、ActiveRecord::NoDatabaseErrorが出ましたが、これはこちらにまとめて置きます。 参考資料
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

一度の INSERT 文で複数行追加する(Oracle とそれ以外で)

自分用まとめ RDBMS の主要製品とそのお試しを書いていて、気づいたのでメモ お約束 間違いが含まれる可能性がそこそこあります。 間違いを見つけたら「どこを」「どのように」修正すべきか教えてください。 やりたいこと あるテーブルに対し、一度の INSERT 文で複数の行を挿入したい。 設定 このようなテーブルを作る。 ID NAME AGE DDL CREATE TABLE Students ( id INT PRIMARY KEY, name VARCHAR(16), age INT ); INSERT するコード MySQL 等 MySQL等で複数行追加の例 INSERT INTO Students VALUES (1, 'Alice', 16), (2, 'Bob', 18), (3, 'Charlie', 15), (4, 'David', 23); MySQL でも PostgreSQL でも SQL Server でもこれでできる。 が、この書き方はOracle DataBase ではできない… Oracle Database Oracleで複数行追加の例 INSERT ALL -- ここに ALL がつく INTO Students VALUES (1, 'Alice', 16) -- 行末にカンマをつけないこと! INTO Students VALUES (2, 'Bob', 18) -- カンマをつけると、 INTO Students VALUES (3, 'Charlie', 15) -- ORA-00928: missing SELECT keyword INTO Students VALUES (4, 'David', 23) -- となります SELECT * FROM DUAL; 1つずつ INSERT INTO するのとほぼ変わらないやん…(絶望) この構文は、ある表から SELECT して別の表へ INSERT する時の書き方がベースになっているように見える。 ただし、今回は元の表が無いので、元の表を指定する部分は SELECT * FROM DUAL として省略している。 (SELECT 1 FROM DUAL とかにしても動く。何を SELECT するかはどうでもいいらしい) 逆に、この書き方は、MySQL 等ではエラーとなる。 「この書き方ならどの製品でも動く」という書き方はないらしい? 余談 MySQL等の書き方は、「1つのテーブルに複数の行を挿入」するものであるが、 Oracle Database の書き方は「テーブルを指定した INSERT を複数行う」というイメージ。 つまり、Oracle では異なる複数のテーブルに対して一度に INSERT することもできる。 2つの異なるテーブルにINSERT -- DROP TABLE Students; -- DROP TABLE Evaluations; CREATE TABLE Students ( id INT PRIMARY KEY, name VARCHAR(16), age INT ); CREATE TABLE Evaluations ( name VARCHAR(16), subject VARCHAR(16), score INT, PRIMARY KEY(name, subject) ); INSERT ALL -- Students と Evaluations へ INSERT INTO Students VALUES (1, 'Alice', 16) INTO Students VALUES (2, 'Bob', 18) INTO Evaluations VALUES ('Alice', 'english', 30) INTO Evaluations VALUES ('Alice', 'math', 60) INTO Evaluations VALUES ('Bob', 'english', 40) INTO Evaluations VALUES ('Bob', 'math', 80) SELECT * FROM DUAL; 検証環境 $ mysql --version mysql Ver 8.0.26 for macos11.4 on arm64 (Homebrew) $ psql --version psql (PostgreSQL) 12.7 Oracle は LiveSQL を使用。 その他、SQL Server 15.0.2000 でも検証。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む