前提・実現したいこと
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
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/30 13:33