20210412のMySQLに関する記事は5件です。

webプログラミングで作る最初の題材は掲示板だよね、本気で作った結果

最終的にはレンタル掲示板になるよね 無料レンタル掲示板NIERU.NET http://nieru.net 掲示板サンプル http://nieru.net/sample/ PHP7.4 mysql 自分が利用してたサービスだからこそ作れるよね 携帯専用掲示板サイトを5年以上利用してそのサイトを10年以上運営して 掲示板サイト利用者からレンタル掲示板運営者になれて1つの夢が叶った感じ 最初は挫折するよね 2013年頃、PHPの勉強がてら掲示板を作ろうと努力したけど検索機能を実装する辺りで挫折した 当時は何がダメなのかも分からなかった フレームワークは便利らしいよね コードの書き方は全て自分ルールになっている 共同開発しないから問題はなし 何処かの会社で働くこともしないから問題なし 仕事を受注しないから問題なし ソースコードは見せられないよね if,swtich,includeのオンパレード 自分がわかれば問題ない 機能は沢山付けるよね いろんなレンタル掲示板サイトを参考にして取り込める機能は全て取り込んだ 一部の有料レンタル掲示板より機能が豊富になった バグはたくさん出るけど気付かないよね レンタル掲示板を開始して利用者が増えたおかげで見つかるバグがある バグを報告してくれる方もいるので、利用ユーザーと一緒に作り上げてる感が良いよね
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Djangoをcloudrunにデプロイするとき、開発と本番でDBを分ける方法

はじめに DjangoでDBを使用するとき、settings.pyにDBの情報を書くと思うんですが、本番と開発で分けるときに少しハマったので備忘録として書いておきます。 今回はGoogleのcloudrunでデプロイしました。 前提条件 ・GCPでアカウントを作成している ・cloudsqlでインスタンスとDBを作成している ・cloudmigrate.yamlを作成している settings.pyを分割する 元々settings.pyがあるディレクトリにsettingsというフォルダを作成します。 作成したら、settings.pyをsettingsに移動します。 settings.pyの名前をbase.pyに変更し、別で_init_.py、local.py、production.pyをsettingsの中に作成します。 以下のようになっていればOKです。 settings/ __init__.py base.py local.py production.py local.pyとproduction.pyを編集する base.pyに書いてあるDBの情報を消して、開発のDBと本番(cloudsql)のDBの情報をlocal.pyとproduction.pyにそれぞれ追記します。また、はじめにbase.pyの情報をimportしておきます。 local.py from .base import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' 'NAME': 'DB_NAME' 'USER': 'root' 'PASSWORD': 'password' 'HOST': 'localhost' 'PORT': '3306' } } production.py from .base import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' 'NAME': 'DB_NAME' 'USER': 'USER_NAME' 'PASSWORD': 'password' 'HOST': 'cloudsql/~' } } base.pyを編集する こちらのファイルではDBの情報を削除します。 またcloudrunにデプロイするときに使うimageをbuildするときにcollectstaticをする必要があるのですが、settingsにファイルを分割したことでディレクトリ構造が変わったため、base.pyの記述を少し変えます。 base.py from .base import * STATIC_URL = '/static/' STATICFILES_DIRS = { os.path.join(BASE_DIR, '../static'), #..を追加 } STATIC_ROOT = os.path.join(BASE_DIR, '../staticfiles') #..を追加 他にも少し修正する wsgi.py os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production') #productionを追加 manage.py os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production')#productionを追加 manage.pyをproductionしているので、ローカルサーバを立ち上げるときは以下のコマンドを入力します。 % python manage.py runserver --settings config.settings.local おわりに 本番用にbuildするときは、通常通り以下のようにすれば大丈夫だと思います。 % gcloud builds submit --config cloudmigrate.yaml --substitutions _INSTANCE_NAME=~~~, _REGION=~~~ 他にも本番と開発のsettingsファイルで分割できるところはあると思いますが、今回はDB中心に書きました。 参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MYSQLdbのexecuteメソッドに文字列を代入する時の注意点

メモ帳がわりの記事 python側のコードから直接SQLを書いてMySQLに投げる時の注意点 これはエラーにならない hoge = 1 cursor.execute(""" SELECT 〜いろんなカラム〜 FROM てーぶる名 WHERE カラム1=%s ; """, (hoge,)) これはエラーになる hoge = ' IN (0, 1)' cursor.execute(""" SELECT 〜いろんなカラム〜 FROM てーぶる名 WHERE カラム1%s ; """, (hoge,)) 下記のようなエラーが表示される。改行コード\nが含まれている。 文字列が入ると改行コードも含まれてしまうようになる? (よくわからないので、詳しい人は教えていただきたい django.db.utils.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''=1 '\n AND latitude IS NOT NULL\n AND カラム1 IS NOT NULL' at line 4") なので下記のようにするとよい。 重要なポイントは先にquery文を変数に格納することだそうです。 (query = f"""のところ) hantei = True hoge = ' IN (0, 1)' if hantei else ' =1 ' query = f""" SELECT いろんなカラム FROM テーブル名 WHERE カラム1{hoge}; """ cursor.execute(query) 文字列を入れると改行コードを急に含むようになるとか、その辺り良い感じにやってほしい(文句) この記事と関係ないけどf''''''はとても便利
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLであるデータベースのテーブルの行数をテーブル毎に表示するSQL文

備忘録なので SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '<database_name>'; 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MYSQL】SELECT時のDuplicate entryエラー

※現象としては再現可能で回避方法もわかっていますが、なぜエラーになるのかは理解できていません。 MySQL5.6.4では発生しなかったため、MySQL5.7か8起因(5.7では未検証)かと考えられます。 実行環境 Amazon RDS for MySQL(バージョン8.0.21) インスタンスタイプ:db.r6g.large ストレージ:汎用100GB クライアント:Sequel Nightly Build(5446) データ準備 例えば次のようなテーブルを準備します。 CREATE TABLE `orders` ( `user_id` varchar(10) DEFAULT NULL, `order_id` int DEFAULT NULL, `date` date DEFAULT NULL, `money` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `orders` (`user_id`, `order_id`, `date`, `money`) VALUES ('AAA',1111,'2021-03-01',1000), ('AAA',2222,'2021-03-02',2000), ('AAA',3333,'2021-03-03',3000), ('BBB',4444,'2021-03-01',2000), ('BBB',5555,'2021-03-02',4000), ('BBB',6666,'2021-03-03',8000); CREATE TABLE `order_detail` ( `order_id` int DEFAULT NULL, `unit_price` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `order_detail` (`order_id`, `unit_price`) VALUES (1111,500), (2222,1000), (3333,3000), (4444,2000), (5555,2000), (6666,8000), (1111,500), (2222,1000), (5555,2000); CREATE VIEW order_detail_view as select order_id, unit_price, "不明" as item_category FROM order_detail ; エラーになるときの書き方 目的としては、似たようなデータ(例えばECの売上など)で、 こちらのデータにはAという項目があるけどこちらには無い、 というようなデータ間での差を構造として共通化することで、同じSQLで様々なデータの分析をできるようにするためです。 構造をあわせるにあたり、VIEWを使用すればテーブルをいじらなくて済むので良いかなと考え、 存在しない列をVIEW内でダミーとして作成しています。 ただ、次に示す通り、VIEWかどうかは関係が無いようです。 エラー SELECT item_category,COUNT(*) FROM orders a LEFT JOIN order_detail_view b ON a.order_id = b.order_id GROUP BY b.item_category; #このようにVIEWにしなくてもエラーになる SELECT item_category,COUNT(*) FROM orders a LEFT JOIN (SELECT *,"不明" AS item_category #ここが問題 FROM order_detail) b ON a.order_id = b.order_id GROUP BY b.item_category; >Duplicate entry '' for key '/rdsdbdata/tmp/*****.<group_key>' #*****の部分にはなにかIDのようなものが入っていますが、何が載ってるか不明なのでマスクしています。 このような書き方をするとエラーが発生します。 ダミーとして作った列をGROUP BYで指定し、かつカウントを取ろうとしていました。 これがダミーでなければitem_categoryごとの件数を取得するものになります。 回避方法 1.文字列ではなくNULLや空文字にする "不明"のような文字列ではなく""やNULLを指定すると集計できます。 2.ダミー列を先に内部でJOINする このように一度括ってしまえばエラーになりません。 SELECT item_category,COUNT(*) FROM orders a LEFT JOIN (SELECT * FROM order_detail JOIN (SELECT "不明" AS item_category)q1 #この部分 ) b ON a.order_id = b.order_id GROUP BY b.item_category; 3.LEFT JOINじゃなくINNER JOINにする 1のLEFT JOINをINNER JOINにすると動きます。 実行計画 実際に動かすとエラーにはなりますが、実行計画は見ることができます。 ここで見る限りおかしな点が見当たりません。 EXPLAIN SELECT item_category,COUNT(*) FROM orders a LEFT JOIN (SELECT *,"不明" AS item_category FROM order_detail ) b ON a.order_id = b.order_id GROUP BY b.item_category; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE a NULL ALL NULL NULL NULL NULL 6 100.00 Using temporary 1 SIMPLE order_detail NULL ref order_id order_id 5 テスト用.a.order_id 1 100.00 Using index
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む