- 投稿日:2020-11-08T19:12:17+09:00
Mysqlで、テーブル内のデータを消したいときあ
本記事の内容
特定のテーブルないのデータを消すだけです。
カラムやテーブル、DBを削除する方法ではありません。方法
以下は全てターミナルで行う動作です。
1
mysql -u root
でmysqlにログイン。2
use DB名
で、扱いたいデーターベースを指定する。3
delete from テーブル名;
で、データを削除。テーブル名は削除したいータがあるテーブル名を指定。(4)
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`DB名`)
もしも、上記のようなエラーが出たら、これはそのテーブルと他のテーブルで外部キーを使用しているので、削除ができないという表示です。
その時は、set FOREIGN_KEY_CHECKS=0;
と入力し、一旦外部キー制約を無効にします。
その上で、もう一度3の動作を行ってください。
Query OK, 8 rows affected (0.00 sec)
が表示されたら、削除に成功しています。
その後、以下のコマンドで、再び外部キー制約を有効にします。
set FOREIGN_KEY_CHECKS=1;
以上で、データの削除は完了です。
- 投稿日:2020-11-08T19:12:17+09:00
Mysqlで、テーブル内のデータを消したいとき
本記事の内容
特定のテーブルないのデータを消すだけです。
カラムやテーブル、DBを削除する方法ではありません。方法
以下は全てターミナルで行う動作です。
1
mysql -u root
でmysqlにログイン。2
use DB名
で、扱いたいデーターベースを指定する。3
delete from テーブル名;
で、データを削除。テーブル名は削除したいデータがあるテーブル名を指定。(4)
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`DB名`)
もしも、上記のようなエラーが出たら、これはそのテーブルと他のテーブルで外部キーを使用しているので、削除ができないという表示です。
その時は、set FOREIGN_KEY_CHECKS=0;
と入力し、一旦外部キー制約を無効にします。
その上で、もう一度3の動作を行ってください。
Query OK, 8 rows affected (0.00 sec)
が表示され、削除に成功しています。
その後、以下のコマンドで、再び外部キー制約を有効にします。
set FOREIGN_KEY_CHECKS=1;
以上で、データの削除は完了です。
- 投稿日:2020-11-08T16:51:20+09:00
pytest-dockerでデータベースをfixtureする
「データベースをDockerでfixtureするpytest環境例」として次を用意した。
こちらの記事はMySQLだったがPostgreSQLでも確認してみた。
なお、データベース接続インターフェースのライブラリーとして、
を利用したが、他のものを利用する場合もほぼ同じだと思う。
conftest.py の fixture例
pytest-dockerのサンプルでhttpbinの起動待ちしているところ、
def is_responsive(url): try: response = requests.get(url) if response.status_code == 200: return True except ConnectionError: return False @pytest.fixture(scope="session") def http_service(docker_ip, docker_services): """Ensure that HTTP service is up and responsive.""" # `port_for` takes a container port and returns the corresponding host port port = docker_services.port_for("httpbin", 80) url = "http://{}:{}".format(docker_ip, port) docker_services.wait_until_responsive( timeout=30.0, pause=0.1, check=lambda: is_responsive(url) ) return urlこれのデータベース版。アプリケーション側ではSQLAlchemy等のORMを使う場合でも直接接続ライブラリーでconnectしてみた。ORM経由だとSQLAlchemyのcreate_engine()のタイミングなのかどうなのかよくわからないし。ドライバーライブラリー経由で接続して起動確認してるってことを明示する感じで。
MySQL container の場合
MySQLコンテナーが立ち上がりconnect()に対してExceptionがでなくなるまで待つ
def is_mysqld_ready(docker_ip): try: pymysql.connect( host=docker_ip, user=os.getenv('MYSQL_USER', ''), password=os.getenv('MYSQL_PASSWORD', ''), db=os.getenv('MYSQL_DATABASE', '') ) return True except: return False@pytest.fixture(scope="session") def database_service(docker_ip, docker_services): docker_services.wait_until_responsive( timeout=30.0, pause=0.1, check=lambda: is_mysqld_ready(docker_ip) ) returnPostgreSQL container の場合
一緒ですね。
def is_postgresql_ready(docker_ip): try: psycopg2.connect( "postgresql://{user}:{password}@{host}/{db}".format( user=os.getenv('POSTGRES_USER', ''), password=os.getenv('POSTGRES_PASSWORD', ''), host=docker_ip, db=os.getenv('POSTGRES_DB', '') ) ) return True except: return False@pytest.fixture(scope="session") def database_service(docker_ip, docker_services): docker_services.wait_until_responsive( timeout=30.0, pause=0.1, check=lambda: is_postgresql_ready(docker_ip) ) returndocker-compose.yml
# MySQLの場合 version: "3" services: database: image: mysql:5.7 ports: - 3306:3306 volumes: - ./initdb.d:/docker-entrypoint-initdb.d environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE}# PostgreSQLの場合 version: "3" services: database: image: postgres:13 ports: - 5432:5432 volumes: - ./initdb.d:/docker-entrypoint-initdb.d environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB}スキーマとテストデータの準備
あとはdocker-composeでヴォリュームマウントされ初期化実行される
./initdb.d:/docker-entrypoint-initdb.d
の./initdb.d
フォルダにSQLや初期化シェルスクリプトなどを放り込んでおけばテスト可能に。Qiitaの記事だと、Docker で MySQL 起動時にデータの初期化を行う など。
- 投稿日:2020-11-08T14:36:00+09:00
laravel-enum:v2の日本語化
laravel-enumのv2の日本語化の書き方が他の記事と違ったので備忘録的に書き残す
環境
% sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H2 % docker version Client: Docker Engine - Community Cloud integration: 1.0.1 Version: 19.03.13 API version: 1.40 # php -v PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans # php artisan -v Laravel Framework 7.26.1 # mysql --version mysql Ver 14.14 Distrib 5.7.30, for Linux (x86_64) using EditLine wrappercomposer require bensampo/laravel-enum:2.2
最初何も考えずに
composer require bensampo/laravel-enum
叩いたら「最新のlaravel-enumはlaravel7.に対応してない」と怒られた
公式docによるとlaravel7.に対応してるのはbensampo/laravel-enum:2.2
らしいのでバージョン指定でcomposer requireする
公式doc読むの大事ほんとcomposer require bensampo/laravel-enum:2.2
ここからはv2のdocを参照する
enum定義
enumファイル作成
php artisan make:enum UserType
enum定義
UserType.phpuse BenSampo\Enum\Enum; use BenSampo\Enum\Contracts\LocalizedEnum; final class UserType extends Enum implements LocalizedEnum { const Administrator = 1; const SuperAdministrator = 2; }ちなみにmysqlのenum型は0を''として予約されているので1から定義する
日本語化
多言語化のインターフェースを有効にする
# php artisan vendor:publish --provider="BenSampo\Enum\EnumServiceProvider" Copied Directory [/vendor/bensampo/laravel-enum/resources/lang] To [/resources/lang/vendor/laravelEnum] Publishing complete.
resouces/ja
配下にenums.phpを作成して定義resources/lang/ja/enums.php<?php use App\Enums\UserType; return [ UserType::class => [ UserType::Administrator => '管理者', UserType::SuperAdministrator => 'スーパー管理者', ], ];これで日本語化されます
- 投稿日:2020-11-08T11:08:11+09:00
【Rails/AWS】RDSのMySQLに繋がらないエラーの考えられる原因(database.yml)
はじめに
本記事は、RailsアプリをAWSにデプロイした際に発生する可能性のある
MySQLに繋がらないという事象に対する原因例を紹介します。
原因はかなり初歩的な原因でしたが、筆者はこのエラー原因が特定できずとても苦労したため、
今後同じエラーに遭遇した方の助けになれば幸いです。開発環境
- Ruby 2.5.1
- Rails 5.2.4.4
- AWS(EC2, RDS)
- MySQL(RDS) 5.6.48
前提条件
- RailsアプリをEC2のWebサーバー上にgitクローン済み。
- 基本的な設定は完了済みで、rake db:create RAILS_ENV=productionのコマンドを実行する手前の状態。
- RDSのDBインスタンスを作成済み。
- Railsのdatabase.ymlは下記の内容です。
database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: socket: /tmp/mysql.sock production: <<: *default database: データベース名 host: <%= ENV['DATABASE_HOST_PRODUCTION'] %> username: <%= ENV['DATABASE_USER_NAME_PRODUCTION'] %> password: <%= ENV['DATABASE_PASSWORD_PRODUCTION'] %>エラー内容
以下のコマンドだとRDSのMySQLに繋がったのですが・・・・
[ec2-user@ip-10-0-1-10 アプリのディレクトリ]$ mysql -h RDSのエンドポイント -u root -P 3306 -p以下のコマンドだと繋がらず、MySQLに繋がらないというエラーが出ました。
[ec2-user@ip-10-0-1-10 アプリのディレクトリ]$ rake db:create RAILS_ENV=production Can't connect to MySQL server on '10.0.1.10' (111) Couldn't create 'データベース名' database. Please check your configuration. rake aborted! Mysql2::Error::ConnectionError: Can't connect to MySQL server on '10.0.1.10' (111) Tasks: TOP => db:create (See full trace by running task with --trace)原因/解決策
当初はホスト名の設定ができていなかったので、エンドポイントを環境変数に入れて修正したのですが、
mysqlコマンドだと繋がるのにrakeコマンドだと繋がらないという謎の現象が発生しました。
いろいろ調べたところ、MySQLのパスワードにパスワードに"#"が入っていることが原因でした。
YAMLファイルはコメントアウトの記法が#ということで、パスワードに"#"が入っているとコメントされてしまいます。
パスワードを変更したら無事rakeコマンドが通りました。
みなさんお気を付けください。まとめ
MySQLのパスワードに"#'を含めるのは良くない。
- 投稿日:2020-11-08T09:43:49+09:00
POSTMAN で画像を投稿する
- 投稿日:2020-11-08T01:01:12+09:00
ワードプレスのデータをエクスポートする(phpMyAdminがない場合)
ワードプレスのデータベースにあるデータをエクスポートしたい。
でもphpMyAdminがない!!!使えない。
phpMyAdminがあればディレクターや運用者でもデータのエクスポートも簡単なのですが、ない場合・・・。
サーバーを扱うエンジニアに依頼しないといけない。
でサーバーを扱うエンジニアもワードプレスのことなんぞしらないので、結局どうすればよいのか誰もわからない。
そんなとき用にどうすればよいのかメモしました。まず
ワードプレスのwp-config.phpの情報をもとにその内容をダンプしてください。
これだけでは話が通じれば以下は読まなくてOKです。
少し詳しくメモします。
wp-config.phpの内容が以下とします。// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** // /** WordPress のためのデータベース名 */ define('DB_NAME', 'test_wp'); /** MySQL データベースのユーザー名 */ define('DB_USER', 'abcde'); /** MySQL データベースのパスワード */ define('DB_PASSWORD', '44444'); /** MySQL のホスト名 */ define('DB_HOST', 'mysql725.db.〇〇〇.ne.jp'); /** WordPress のためのデータベース名 */ define('DB_NAME', 'test_wp'); $table_prefix = 'wp_';特定のプレフィックスを持つテーブルのダンプ($table_prefixの値)をする
※サーバー名やユーザー名、パスワードなどはwp-config.phpの内容で適時置き換えてください。
①テーブル名がwp_から始まるテーブル名をtable.txtに出力する($table_prefixの値)
mysql -u abcde -p -h mysql725.db.〇〇〇.ne.jp -N information_schema -e "SELECT table_name FROM tables WHERE table_schema='test_wp' AND table_name LIKE 'wp_%'" > tables.txt② ①で作成したtable.txtをもとにエクスポートしたデータを dump.txtに出力する
mysqldump -u abcde -p -h mysql725.db.〇〇〇.ne.jp test_wp `cat tables.txt` > dump.txt※グーグルで 「mysql ダンプ」 で検索すると一番上にでてくる方法
mysqldump -u abcde -p -h mysql725.db.〇〇〇.ne.jp test_wp > dump.txtこの方法で取得したダンプファイルを渡されたことがありました。
この方法だとデータベースにあるテーブルのすべてがエクスポートされるのです。
同じデータベースに30個ものワードプレスが同居してたため、その中から必要なワードプレスのデータを抜き出すのに多大な時間がかかったのを覚えています。
なので、次はテーブルプリフィックスが〇〇のもののデータをくださいと言わねば
と心にちかったのです。
- 投稿日:2020-11-08T00:16:54+09:00
Laravel MAMPの設定からmigrateまでの手順
環境
・Laravel 6.19.1
・MAMP 5.7MAMPをインストールし、Webブラウザを立ち上げる
MAMPをインストールし、起動する。
MAMPインストールページ起動後、「⌘ + ,」を入力し、Preferenceを立ち上げる。
Portsタブを選択し、「Apache Port」と「Nginx Port」を80、「MySQL Port」を3306に変更する。
OKを選択し、次はMAMPの「Start Servers」をクリックする。
サーバーが立ち上がると、MAMPのWebページトップに遷移する。
「TOOLS」タブを選択し、「PHPMYADMIN」を選択する。データーベース設定を行う
ここから本題のデーターベース設定に移っていく。
まずはデフォルトでは英語の設定になっているので、日本語に設定を行う。
次に左のサイドメニューから「新規作成」をクリックし、データーベースを作成していく。
データーベース名を入力し、「作成」をクリックすると、先ほど入力したデーターベース名で新規作成される。データベース ユーザーの作成
先程作成したデーターベースを選択し、タブの「特権」を選択する。
下に「ユーザーアカウントを追加する」とあるので、クリックする。
ログイン情報の設定を行う画面に遷移するので、「ユーザー名」と「パスワード」を任意で設定し、
ホスト名を「%」→「localhost」に変更する。
ページの下の方にいくと、「Check all」とあるので、チェックを入れる。
右下の「実行」をクリックすると、ユーザーが新規作成される。
改めて新規作成したデータベースを選択 -> 「特権」をクリックし、作成したユーザーが表示されていればOK。
MySQL側の設定はこれで完了。Laravel データベース設定
VSCodeなどのエディタを使い、環境設定ファイル(.envファイル)を開く。
画像に基づき、必要な情報を入力していく。database.phpの設定。
次に、データベース設定ファイル( config > database.php )を開く。
46行目あたりから、mysqlの設定が記載されているので移動してください。'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ],デフォルトでは
'unix_socket' => env('DB_SOCKET', ''),
となっているのでここを'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',に変更する。
この設定を行わないと、$ php artisan migrate
コマンドを入力した際にエラーが発生する。(下記参照)[PDOException]SQLSTATE[HY000] [2002] No such file or directoryphp artisan migrate 実行
ここまでの手順を踏み、ターミナルでmigrateコマンドを入力する。
$ php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_18_19_000000_create_failed_jobs_tableこのような表示がされれば上手くいっています。
念のため、MAMPのWebページに戻り、新規作成したデーターベースを確認してみましょう。
このように、テーブルが3つ作成されていれば問題ないです。
今回は以上になります。
- 投稿日:2020-11-08T00:16:54+09:00
Laravel MAMPの設定からmigrateまでの手順 [忘備録]
環境
・PHP 7.4.9
・Laravel 6.19.1
・MAMP 5.7MAMPをインストールし、Webブラウザを立ち上げる
MAMPをインストールし、起動する。
MAMPインストールページ起動後、「⌘ + ,」を入力し、Preferenceを立ち上げる。
Portsタブを選択し、「Apache Port」と「Nginx Port」を80、「MySQL Port」を3306に変更する。
OKを選択し、次はMAMPの「Start Servers」をクリックする。
サーバーが立ち上がると、MAMPのWebページトップに遷移する。
「TOOLS」タブを選択し、「PHPMYADMIN」を選択する。データーベース設定を行う
ここから本題のデーターベース設定に移っていく。
まずはデフォルトでは英語の設定になっているので、日本語に設定を行う。
次に左のサイドメニューから「新規作成」をクリックし、データーベースを作成していく。
データーベース名を入力し、「作成」をクリックする。
入力したデーターベース名で、左サイドメニューに新規作成されていれば上手くいってます。
次はデーターベースユーザーの作成を行っていきます。データベース ユーザーの作成
先程作成したデーターベースを選択し、画面右上に表示されているタブの「特権」を選択する。
下に「ユーザーアカウントを追加する」とあるので、クリックする。
ログイン情報の設定を行う画面に遷移するので、「ユーザー名」と「パスワード」を任意で設定し、
ホスト名を「%」→「localhost」に変更する。
ページの下の方にいくと、「Check all」とあるので、チェックを入れる。
右下の「実行」をクリックすると、ユーザーが新規作成される。
改めて新規作成したデータベースを選択 -> 「特権」をクリックし、作成したユーザーが表示されていればOK。
MySQL側の設定はこれで完了。Laravel データベース設定
VSCodeなどのエディタを使い、環境設定ファイル(.envファイル)を開く。
画像に基づき、必要な情報を入力していく。(下記参考例)DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=test DB_USERNAME=test_user DB_PASSWORD=test12345database.phpの設定。
次に、データベース設定ファイル( config > database.php )を開く。
46行目あたりから、mysqlの設定が記載されているので移動してください。'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ],デフォルトでは
'unix_socket' => env('DB_SOCKET', ''),
となっているのでここを'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',に変更する。
この設定を行わないと、$ php artisan migrate
コマンドを入力した際にエラーが発生する。(下記参照)[PDOException]SQLSTATE[HY000] [2002] No such file or directoryphp artisan migrate 実行
ここまでの手順を踏み、ターミナルでmigrateコマンドを入力する。
$ php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_18_19_000000_create_failed_jobs_tableこのような表示がされれば上手くいっています。
念のため、MAMPのWebページに戻り、新規作成したデーターベースを確認してみましょう。
このように、テーブルが3つ作成されていれば問題ないです。
今回は以上になります。