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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1594閲覧

PythonでMySQL X DevAPIの公式チュートリアルを動かしたい(mysqlx)

mullen

総合スコア7

MySQL

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/05/21 15:28

編集2018/05/30 14:44

前提・実現したいこと

PythonからMySQL公式のライブラリ(mysql-connector-python)を使用して、接続するサンプルプログラムを作成しています。

環境は、一番したに記載しています。

具体的には、公式のチュートリアルに、掲載されているプログラムを動作させようとしています。

該当のソースコード

次のソースコードの、result = collection.find().limit(1).execute()の箇所で、エラーが発生します。
ところどころにprintが入っているのは、自分でDebugしたときのものです。

python

1import mysqlx 2 3# Connect to server on localhost 4session = mysqlx.get_session({ 5 'host': 'localhost', 6 'port': 33060, 7 'user': 'root', 8 'password': 'root' 9}) 10 11schema = session.get_schema('world_x') 12print ("** schema is exists ? => "+ str(schema.exists_in_database())) #Debug用 13 14# Use the collection 'my_collection' 15collection = schema.get_collection('country') 16print ("** collection is exists ? => " + str(collection.exists_in_database())) #Debug用 17print ("** collection count ? => " + str(collection.count())) #Debug用 18 19# Specify which document to find with Collection.find() 20result = collection.find().limit(1).execute() 21 22# Print document 23docs = result.fetch_all() 24print('Code: {0}'.format(docs[0]['Code'])) 25print('Name: {0}'.format(docs[0]['Name'])) 26 27session.close()

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

実行時のエラーメッセージは次のとおりです。

C:\Code\myvenv>python .\TEST\Test.py ** schema is exists ? => True ** collection is exists ? => True ** collection count ? => 239 Traceback (most recent call last): File ".\TEST\Test.py", line 20, in <module> result = collection.find().limit(1).execute() File "C:\Code\myvenv\lib\site-packages\mysqlx\statement.py", line 809, in execute return self._connection.find(self) File "C:\Code\myvenv\lib\site-packages\mysqlx\connection.py", line 228, in wrapper return func(self, *args, **kwargs) File "C:\Code\myvenv\lib\site-packages\mysqlx\connection.py", line 509, in find return DocResult(self) if statement.is_doc_based() else RowResult(self) File "C:\Code\myvenv\lib\site-packages\mysqlx\result.py", line 892, in __init__ super(DocResult, self).__init__(connection) File "C:\Code\myvenv\lib\site-packages\mysqlx\result.py", line 740, in __init__ self._init_result() File "C:\Code\myvenv\lib\site-packages\mysqlx\result.py", line 752, in _init_result self._columns = self._connection.get_column_metadata(self) File "C:\Code\myvenv\lib\site-packages\mysqlx\connection.py", line 228, in wrapper return func(self, *args, **kwargs) File "C:\Code\myvenv\lib\site-packages\mysqlx\connection.py", line 622, in get_column_metadata return self.protocol.get_column_metadata(result) File "C:\Code\myvenv\lib\site-packages\mysqlx\protocol.py", line 557, in get_column_metadata msg = self._read_message(result) File "C:\Code\myvenv\lib\site-packages\mysqlx\protocol.py", line 248, in _read_message raise OperationalError(msg["msg"])mysqlx.errors.OperationalError: Unknown column 'doc' in collection C:\Code\myvenv>

その他補足情報

  • MySQLのコマンドラインからroot/rootでログインして接続はできます。
  • rootの認証方式を、caching_sha2_passwordから、mysql_native_password へ変更しています。これはVSCodeのExtentionが、新しい認証方式に対応していないようだったので、変更しました。
  • world_xのデータベースは、MySQL公式のOther MySQL Documentationからダウンロードしたものを使用しています。データの内容は以下の通りです。

sql

1mysql> use mysql 2mysql> select user,plugin from user; 3+------------------+-----------------------+ 4| user | plugin | 5+------------------+-----------------------+ 6| mysql.infoschema | mysql_native_password | 7| mysql.session | mysql_native_password | 8| mysql.sys | mysql_native_password | 9| root | mysql_native_password | 10+------------------+-----------------------+ 116 rows in set (0.00 sec) 12 13mysql> use world_x 14Database changed 15mysql> select * from country limit 5; -- countryテーブルのサンプルです。 16+------+-------------+---------+-------+ 17| Code | Name | Capital | Code2 | 18+------+-------------+---------+-------+ 19| ABW | Aruba | 129 | AW | 20| AFG | Afghanistan | 1 | AF | 21| AGO | Angola | 56 | AO | 22| AIA | Anguilla | 62 | AI | 23| ALB | Albania | 34 | AL | 24+------+-------------+---------+-------+ 255 rows in set (0.00 sec) 26 27mysql>

####get_collection()を使わない場合

試しに、get_collection()を使用せずに、get_table()を使った場合は正常に動きました。

python

1import mysqlx 2 3# Connect to server on localhost 4session = mysqlx.get_session({ 5 'host': 'localhost', 6 'port': 33060, 7 'user': 'root', 8 'password': 'root' 9}) 10 11schema = session.get_schema('world_x') 12 13table = schema.get_table('country') 14 15result = table.select().limit(5).execute() 16records = result.fetch_all() 17 18for record in records: 19 print (record.get_string("Code"),end='') 20 print (' : ', end='') 21 print (record.get_string("Name")) 22 23session.close()
C:\Code\myvenv>python .\TEST\Test2.py ABW : Aruba AFG : Afghanistan AGO : Angola AIA : Anguilla ALB : Albania

環境

Windows 10
Python 3.6.5
MySQL 8.0.11
mysql-connector-python 8.0.11

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

'country' を find するのであれば 'country' は、テーブルなので、
テーブルとしてアクセスするコードは問題ないですね。

公式チュートリアルを動かす、つまり、'my_collection' を collection として
find するのであれば、公式チュートリアルの中ほどから下方に記載されているコードを
参考にして、事前に collection を作成して、データを追加しておく必要があります。

公式チュートリアル、コードの整合性も取れていないし、時系列もおかしいし、
なかなか荒っぽいですね。苦労しそうなカンジ。

投稿2018/05/29 14:10

masaru-saitou

総合スコア34

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

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

mullen

2018/05/30 13:33

ありがとうございます。解決しました。あとで書きます。
guest

0

MySQLのことを全然理解していないまま、やってしまったのが悪かったです。

まず、Tableの項目の中にJSONがそのまま入っているTableのことをCollectionと呼ぶ。そしてこれは、Collectionとしてアクセスする場合のAPIのチュートリアルである。
という理解をしました。(大体はあってる?)

そして、使用したサンプルDBのworld_xのサンプルのページ、20.3.2 Import Database Sampleにも記載されている通り、Collectionとして、利用できるTableはcountryinfoであり、それ以外は普通のTableである。

以下引用。

  • Collection

countryinfo: Information about countries in the world.

  • Tables

country: Minimal information about countries of the world.
city: Information about some of the cities in those countries.
countrylanguage: Languages spoken in each country.

つまり、私が作成していたプログラムでは、get_collection('country')としていたが、countryは、JSONを含むカラムがないため、そもそも全然意味ない、わけわかんないことをやろうとしていたということですね。

ちなみに、countryinfoをWorkBenchで覗いてみたらこんな感じ。

countryinfo

直したコード↓

python

1import mysqlx 2 3# Connect to server on localhost 4session = mysqlx.get_session({ 5 'host': 'localhost', 6 'port': 33060, 7 'user': 'root', 8 'password': 'root' 9}) 10 11schema = session.get_schema('world_x') 12print ("** schema is exists ? => " + str(schema.exists_in_database())) 13 14# Collectionとして使えるテーブル一覧 15for collect in schema.get_collections(): 16 print ("** collection Table? => " + str(collect.name)) 17 18# Use the collection 'my_collection' 19collection = schema.get_collection('countryinfo') 20print ("** collection is exists ? => " + str(collection.exists_in_database())) 21 22# Specify which document to find with Collection.find() 23print ("** collection count ? => " + str(collection.count())) 24result = collection.find().limit(5).execute() 25 26# Print document 27docs = result.fetch_all() 28 29for doc in docs: 30 print('Name: {:<15} '.format(doc['Name']),end='') 31 print('Population: {:>12,} '.format(doc['demographics']['Population']),end='') 32 print('LifeExpectancy: {} '.format(doc['demographics']['LifeExpectancy'])) 33 34session.close()

実行結果

(myvenv) C:\Code\myvenv>.\TEST\Test.py ** schema is exists ? => True ** collection Table? => countryinfo ** collection is exists ? => True ** collection count ? => 239 Name: Aruba Population: 103,000 LifeExpectancy: 78.4000015258789 Name: Afghanistan Population: 22,720,000 LifeExpectancy: 45.900001525878906 Name: Angola Population: 12,878,000 LifeExpectancy: 38.29999923706055 Name: Anguilla Population: 8,000 LifeExpectancy: 76.0999984741211 Name: Albania Population: 3,401,200 LifeExpectancy: 71.5999984741211 (myvenv) C:\Code\myvenv>

投稿2018/05/30 14:31

編集2018/05/30 14:41
mullen

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問