質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Q&A

解決済

1回答

1041閲覧

MySQLのデータ型について(flask-SQLAlchemyを使用)

Kta0000

総合スコア3

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

0グッド

0クリップ

投稿2023/01/02 14:39

前提

flaskで緯度経度を用いて地図表示するwebアプリを開発をしています。
その際のデータベースのテーブル作成時にエラーが発生しました。

実現したいこと

  • 緯度経度をテーブルに保存するために、double型のカラムを作成したい。

発生している問題・エラーメッセージ

sqlalchemy.exc.CompileError: (in table 'memos', column 'lat'): Can't generate DDL for NullType(); did you forget to specify a type on this Column?

該当のソースコード

python

1from flask import Flask, request 2from flask_sqlalchemy import SQLAlchemy 3from sqlalchemy.dialects.mysql import INTEGER, VARCHAR # MySQLのテーブルを作る時に必要 4 5 6app = Flask(__name__) 7 8# MySQLに接続するための情報 9app.config["SQLALCHEMY_DATABASE_URI"] = 'mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{ 10 'user': "root", 11 'password': "{{パスワード}}", 12 'host': "localhost", 13 'db_name': "test" 14 }) 15# おまじない 16app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False 17 18# dbの初期化 19db = SQLAlchemy(app) 20 21class Memo(db.Model): 22 """ 23 Memoモデルの定義 24 """ 25 __tablename__ = "memos" 26 27 id = db.Column("id", INTEGER(11), primary_key=True) 28 name = db.Column(db.Text) 29 adress = db.Column(db.Text) 30 lat = db.Column(db.double(9,6)) 31 lng = db.Column(db.double(9,6)) 32 date = db.Column(db.Text) 33 score = db.Column(db.Integer) 34 review = db.Column(db.Text) 35 image = db.Column(db.BLOB)

python(対話モード)

1>>> from app import app 2>>> from app import db 3>>> with app.app_context(): 4... db.create_all()

試したこと

調べましたが、double型が使えないなどは書いていなかったので、私のコードに問題があると考えています。

もしくはMySQLのバージョン(8.0.31)に問題があるのでしょうか

補足情報(FW/ツールのバージョンなど)

click==8.1.3
colorama==0.4.5
Flask==2.2.2
Flask-Markdown==0.3
Flask-SQLAlchemy==2.5.1
greenlet==1.1.3
itsdangerous==2.1.2
Jinja2==3.1.2
Markdown==3.4.1
MarkupSafe==2.1.1
mysql-connector-python==8.0.31
PyMySQL==1.0.2
SQLAlchemy==1.4.41
Werkzeug==2.2.2

MySQL==8.0.31

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/01/02 14:58 編集

sqlalchemy.types には double はなく、sqlalchemy.types.Float か sqlalchemy.types.Numeric を指定するのではないでしょうか。今回の場合は Numeric になりそうです。 lat = db.Column(db.Numeric(9,6))
guest

回答1

0

ベストアンサー

SqlAlchemyでは一般的なCamelCaseのデータタイプの他に、データベース固有のUPPERCASEなデータタイプを直接指定できます。
https://docs.sqlalchemy.org/en/14/core/type_basics.html#backend-specific-uppercase-datatypes

MySQL固有のデータ型のdoubleは以下で定義されています。
https://docs.sqlalchemy.org/en/14/dialects/mysql.html#sqlalchemy.dialects.mysql.DECIMAL
の次にsqlalchemy.dialects.mysql.DOUBLEの記述があります(HTMLにはアンカーがない)。

なので、3行目を

from sqlalchemy.dialects.mysql import INTEGER, VARCHAR, DOUBLE

としておけば、30行目、31行目のdb.doubleをDOUBLEにすることで、double型のテーブルが出来ます。

確認用おまけ

bash

1cat >docker-compose.yml <<EOF 2version: '3.1' 3services: 4 db: 5 image: mysql:8.0.31 6 command: --default-authentication-plugin=mysql_native_password 7 volumes: 8 - ./data:/var/lib/mysql 9 - ./logs:/var/log/mysql 10 ports: 11 - 3306:3306 12 environment: 13 MYSQL_ROOT_PASSWORD: example 14EOF 15PYTHON=python 16if ! command -v $PYTHON; then 17 PYTHON=python3 18fi 19$PYTHON -m venv env 20source ./env/bin/activate 21cat >requirements.txt <<EOF 22click==8.1.3 23colorama==0.4.5 24Flask==2.2.2 25Flask-Markdown==0.3 26Flask-SQLAlchemy==2.5.1 27greenlet==1.1.3 28itsdangerous==2.1.2 29Jinja2==3.1.2 30Markdown==3.4.1 31MarkupSafe==2.1.1 32mysql-connector-python==8.0.31 33PyMySQL==1.0.2 34SQLAlchemy==1.4.41 35Werkzeug==2.2.2 36EOF 37pip install -r requirements.txt 38docker-compose up -d 39sleep 30 # wait for mysql 40cat >app.py <<EOF 41from flask import Flask, request 42from flask_sqlalchemy import SQLAlchemy 43from sqlalchemy.dialects.mysql import INTEGER, VARCHAR, DOUBLE # MySQLのテーブルを作る時に必要 44 45 46app = Flask(__name__) 47 48# MySQLに接続するための情報 49app.config["SQLALCHEMY_DATABASE_URI"] = 'mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{ 50 'user': "root", 51 'password': "example", 52 'host': "localhost", 53 'db_name': "mysql" 54 }) 55# おまじない 56app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False 57 58# dbの初期化 59db = SQLAlchemy(app) 60 61class Memo(db.Model): 62 """ 63 Memoモデルの定義 64 """ 65 __tablename__ = "memos" 66 67 id = db.Column("id", INTEGER(11), primary_key=True) 68 name = db.Column(db.Text) 69 adress = db.Column(db.Text) 70 lat = db.Column(DOUBLE(9,6)) 71 lng = db.Column(DOUBLE(9,6)) 72 date = db.Column(db.Text) 73 score = db.Column(db.Integer) 74 review = db.Column(db.Text) 75 image = db.Column(db.BLOB) 76EOF 77cat >initdb.py <<EOF 78from app import app, db 79with app.app_context(): 80 db.create_all() 81EOF 82python initdb.py 83docker-compose exec -T db mysql --database=mysql --user=root --password=example <<EOF 84describe memos; 85EOF 86docker-compose down 87deactivate

投稿2023/01/02 23:01

dameo

総合スコア943

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kta0000

2023/01/05 08:53

ありがとうございます。もっとドキュメントを読む力がいるということがわかりました。 お返事が遅くなってしまいすみません。またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問