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

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

ただいまの
回答率

90.75%

  • Python

    6873questions

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

  • MySQL

    5520questions

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

  • Python 3.x

    5326questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 215

mullen

score 1

 前提・実現したいこと

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

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

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

 該当のソースコード

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

import mysqlx

# Connect to server on localhost
session = mysqlx.get_session({
    'host': 'localhost',
    'port': 33060,
    'user': 'root',
    'password': 'root'
})

schema = session.get_schema('world_x')
print ("** schema is exists ? => "+ str(schema.exists_in_database())) #Debug用

# Use the collection 'my_collection'
collection = schema.get_collection('country')
print ("** collection is exists ? => " + str(collection.exists_in_database())) #Debug用
print ("** collection count ? => " + str(collection.count())) #Debug用

# Specify which document to find with Collection.find()
result = collection.find().limit(1).execute()

# Print document
docs = result.fetch_all()
print('Code: {0}'.format(docs[0]['Code']))
print('Name: {0}'.format(docs[0]['Name']))

session.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からダウンロードしたものを使用しています。データの内容は以下の通りです。
mysql> use mysql
mysql> select user,plugin from user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | mysql_native_password |
| mysql.session    | mysql_native_password |
| mysql.sys        | mysql_native_password |
| root             | mysql_native_password |
+------------------+-----------------------+
6 rows in set (0.00 sec)

mysql> use world_x
Database changed
mysql> select * from country limit 5;     -- countryテーブルのサンプルです。
+------+-------------+---------+-------+
| Code | Name        | Capital | Code2 |
+------+-------------+---------+-------+
| ABW  | Aruba       |     129 | AW    |
| AFG  | Afghanistan |       1 | AF    |
| AGO  | Angola      |      56 | AO    |
| AIA  | Anguilla    |      62 | AI    |
| ALB  | Albania     |      34 | AL    |
+------+-------------+---------+-------+
5 rows in set (0.00 sec)

mysql>

get_collection()を使わない場合

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

import mysqlx

# Connect to server on localhost
session = mysqlx.get_session({
    'host': 'localhost',
    'port': 33060,
    'user': 'root',
    'password': 'root'
})

schema = session.get_schema('world_x')

table = schema.get_table('country')

result = table.select().limit(5).execute()
records = result.fetch_all()

for record in records:
    print (record.get_string("Code"),end='')
    print (' : ', end='')
    print (record.get_string("Name"))

session.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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 22:33

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

    キャンセル

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

直したコード↓

import mysqlx

# Connect to server on localhost
session = mysqlx.get_session({
    'host': 'localhost',
    'port': 33060,
    'user': 'root',
    'password': 'root'
})

schema = session.get_schema('world_x')
print ("** schema is exists ? => " + str(schema.exists_in_database()))

# Collectionとして使えるテーブル一覧
for collect in schema.get_collections():
    print ("** collection Table? => " + str(collect.name))

# Use the collection 'my_collection'
collection = schema.get_collection('countryinfo')
print ("** collection is exists ? => " + str(collection.exists_in_database()))

# Specify which document to find with Collection.find()
print ("** collection count ? => " + str(collection.count()))
result = collection.find().limit(5).execute()

# Print document
docs = result.fetch_all()

for doc in docs:
    print('Name: {:<15} '.format(doc['Name']),end='')
    print('Population: {:>12,}  '.format(doc['demographics']['Population']),end='')
    print('LifeExpectancy: {} '.format(doc['demographics']['LifeExpectancy']))

session.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>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    XMLファイルで、指定した文字列を検索し、その位置情報を取得したい。

    前提・実現したいこと XMLファイルで、指定した文字列を検索し、その位置情報を取得したい。 発生している問題・エラーメッセージ 以下、インプットのXMLファイルのrank

  • 受付中

    pythonでmysqlconnectorを使う際

    pythonでmysqlを操作して、日本語を取り出しその後それをcsvに書き込みたいのですが、 res = cursor.fetchall() で取り出した後に、どこかで .

  • 解決済

    ファイルの中から特定の文字列の抽出

    ダンプデータの中から、”abcd"という文字を発見したら、”xyz”という文字を見つけるまで、そこの間の文字を抽出し、ファイルに出力したいのですが、どのようなソースコードを書けばよ

  • 解決済

    Pythonの関数内でのselfによる変数の定義について

    質問の概要 Pythonのselfに関して、少し疑問点が見つかりましたので、 質問させて頂きます。 該当のソースコード class Test: def __init__

  • 解決済

    C#でMySQLを使ってSQLをエクスポートしたい

    いつも大変お世話になっております。 C#を使ってMySQLの特定のテーブルのSQLをエクスポートする機能を作ろうとしています。 テーブル内のデータを出力するのではなく、テーブル

  • 解決済

    mysql python 値 取得後比較

    やりたいこと:mysqlのデータを取り出し、変数に代入。その後条件を満たしたものを表示。 mysql table:test rate | //// |////|... 0.02

  • 解決済

    PythonでMySQLの更新をした後に更新した内容を表示できない

    前提・実現したいこと PythonでDBの更新をした後に更新した内容を表示したいです 発生している問題・エラーメッセージ DBにデータを挿入はできているのですが挿入したデータが

  • 受付中

    タグ検索機能について。

    ブログや、wikiなどにあるタグ機能。 クリックすると、そのタグの一覧が表示されたりするアレです。 Toxiなどのデータベースを利用して実装する方法があるのは知ってます。

同じタグがついた質問を見る

  • Python

    6873questions

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

  • MySQL

    5520questions

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

  • Python 3.x

    5326questions

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