1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初心者 MySQL8に挑戦する 18

Last updated at Posted at 2022-08-27

ちょっとは技術記事っぽく?

 今の私の最大の問題は、mysql_clientには、写経できる「使ってみた」情報が完全にゼロだということ。なので

  • mysql1 vs mysql_client徹底比較

 と言ったって、パッケージの中身を読み解く能力はないので、あくまで表面的。まずpuv.devページのexampleを左右に並べて、書き方の違いを検討する。
 例えば 

  • mysql1ではconn.queryだけど
  • mysql_clientではconn.executeだな

みたいな。 それが本質的な問題か、作者の書き癖なのかもわからないけれども、ともかく違ってるところ全部にマーカーを引く。

次は、mysql1でメンターさんにつくってもらった、IntelMacAirのMySQL5.7で動作確認済みのコードを、ごく単純に、表面的にmysql_clientの用語に変えて、m1macに書いてみる。

 まず接続用にmysql.dart

import 'package:mysql_client/mysql_client.dart';

class Mysql {
  static String
    host = 'localhost',
    user = 'dongri727',
    password = '********',
    db = 'aetatum';
  static int port = 3306;

  Mysql();

  Future getConnection() async {
    print("connecting to server");
    final conn = await MySQLConnection.createConnection(
      host: host,
      port: port,
      userName: user,
      password: password,
      databaseName: db,
    );
    await conn.connect();
    print("connected");
  }
}

 至極あっさりできあがって、エラーはない。 
 次、Flutterでおなじみカウンターアプリを改造したmain.dart。

import 'package:flutter/material.dart';
import 'mysql.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter MySQL Demo',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: const MyHomePage(title: 'Flutter MySQL Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  var liaison = Mysql();
  var name = '';

   void _getName() {
    print('je suis la');
    liaison.getConnection().then((conn) async {
      print('ca marche?');
      var result = await conn.execute("SELECT name FROM timeline WHERE id = 1");
      for (final row in result.rows) {
          print('row.assoc()');
          setState((){
            print('dis moi');
            name = row[0];
          });
        }
      });
      //conn.close();
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(

        title: Text(widget.title),
      ),
      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'push button to find events',
            ),
    
            Text(
              style: Theme.of(context).textTheme.headline4,
              name,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _getName,
        tooltip: 'vas-y!',
        child: const Icon(Icons.add),
      ),
    );
  }
}

 まず、関数の終わりのconn.closeにエラーが出た。then((conn)...やconn.executeはいいのに、なんでconn.closeの時だけindefinedと言われるのかわからない。ただ、これはコメントアウトしておいてもとりあえずなんとかなるので、消しておく。

 さあ、debugしてみよう。

  • connecting to server
  • connected

繋がった、MySQL8に繋がってるよ!

 でも・・・
 consoleにca march?(動いてる?)と表示されたところで止まる。そして 

  • NoSuchMethodError:
    • The method 'execute' was called on null.
      Receiver: null
      Tried calling: execute("SELECT name FROM timeline WHE....

と、エラーメッセージが出る。つまりselect文が気に入らない。nullを呼んでるって? ある意味、mysql1でMySQL8に繋いでいたときと似ている。つまり、繋がるけど、クエリ文が気に入らない。

 でも、まだ変更の余地がある。

  • 今、シンプルに void _getName() {

と書いているところを、mysql_clientのexampleに倣って次のように直す。 

  • void _getName(List<*String*>arguments) async {
    (ほんとは*はないんだけれど、なぜかこうしないとStringが消えてしまう)

すると今度はコード上にエラーが出た。

  • The argument type 'void Function(List<*String*>)' can't be assigned to the parameter type 'void Function()?'.

 おお、お初にお目にかかるエラーです。ググったら

  • VoidCallback?

 とか、いろいろ出てきたけど、わからないの上塗りになりそうなので、今日はここで止まることにする。少なくとも

これは私のFlutter知識の不足による問題である。 

 といえるので、たぶん、配列とかリストとか、mapとか、その辺、勉強しなさいよ、と言うことだろう。mysql_clientやMySQL8の問題ではない、と信じて、明日もがんばろう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?