LoginSignup
1
0

More than 1 year has passed since last update.

初心者 Flutter x MySQL8 に挑戦する 19 with mysql_client

Last updated at Posted at 2022-08-28

繋がって、書き直して、書き加えて、読み出す。

 昨日は「MySQL5.7なら動くmysql1プロジェクトをmysql_client風に書き換える」という方向で行ったけれど、今日は逆コース、MySQL8で動いているmysql_clientのサンプルをflutterのカウンターアプリ風に書き換える。

 何が違うか、というと、前者はfileが2枚、後者はペライチ。こっちのfileにあるべきものがあっちに行って、こっちで呼べてない、系のミスを、まだまだ私は自己解決できないので、ペライチはもしかして一つの解決策かも知れないと思うのだ。 

 とはいえ、ペライチは何がイヤかといったら、fileが長い。ここに貼ったらウザイだろうなあ、と思うほど長い。でも、貼っちゃう。笑 

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

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

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

  // This widget is the root of your application.
  @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> {

  Future<void> _defi() async {
    print("Connecting to mysql server...");

    // create connection
    final conn = await MySQLConnection.createConnection(
      host: "127.0.0.1",
      port: 3306,
      userName: "root",
    password: "*****",
      databaseName: "aetatum", // optional
    );

    await conn.connect();

    print("Connected");

    // update some rows
    var res = await conn.execute(
      "UPDATE users SET age = :age WHERE id = 2",
      {"age": 57},
    );

    print(res.affectedRows);

    // insert some rows
    res = await conn.execute(
      "INSERT INTO users (id, name, email, age) VALUES (:id, :name, :email, :age)",
      {
      "id": null,
      "name": "Jane",
      "email": "jane@jane.com",
      "age": "24",
      },
    );

    print(res.affectedRows);

    // make query
    var result = await conn.execute("SELECT * FROM users");

    // print some result data
    print(result.numOfColumns);
    print(result.numOfRows);
    print(result.lastInsertID);
    print(result.affectedRows);

    // print query result
    for (final row in result.rows) {
      // print(row.colAt(0));
      // print(row.colByName("title"));

      // print all rows as Map<String, String>
      print(row.assoc());
    }

    // close all connections
    await 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 move:',
            ),

            Text(
              style: Theme.of(context).textTheme.headline4,
              'これなら動く?'
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _defi,
        tooltip: 'vas-y',
        child: const Icon(Icons.add),
      ),
    );
  }
}

 conn.closeがエラーじゃなくなっている。これがペライチ効果だろう。
 が、最初はonPressedのところが昨日と同じエラーだった。なので沈思黙考の後、関数の引数指定を止めてみた。と、表面的にはエラーが消える。 

 では、いってみましょう。行け! 
 動かん。 
 行け、行け、行け〜!(連打) 

 行ったわ、最後まで。
 しかも、連打したので、consoleに大量のプリントが出た。新規登録のJaneさんはIDだけどんどん自動でインクリメントしながら、大量に登録された。

 次は落ち着いて、一回だけクリック。ちゃんと動くじゃん。またJaneさんが増えてしまった。 

 すると何? 私はm1macに対してさえ、気が短すぎると? 

 まあいいか。 

明日はなんとかして、select結果をリスト表示したい〜!

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