TiDB Cloudにローカルから接続してみる...GUIツールとPythonの2パターン
はじめに
TiDB Cloudを動かしながら学ぶ、アカウント作成〜DB基本操作までの記事にてTiDB Cloud上でSQLを実行することができるようになりました。
今回は、「TiDB Cloud上以外では、どうやってDB接続するんだろう?」を実践していこうと思います。
言語やツール、プログラムを一度に全部試せないので対象を絞らせて頂きましたが下記条件で試します。
# | シーン | 利用手段 |
---|---|---|
1 | 開発・本番運用とリリース後考えてローカルからツールによるDB接続 | DBeaver |
2 | AWS上で稼働を目指したローカル開発でのテスト接続 | Python(SQLAlchemy) |
では、やっていきましょう。
1. DBeaverによるローカルからツールでのDB接続
- 公式ドキュメント
- TiDB Serverless: v7.1.1
- DBeaverバージョン: 23.3.4.202402060628
1-1. TiDB CloudでConnection情報を取得
クラスタを選択します。
右上のConnect
ボタンを押下します。
- 「接続先」は
Public
、「Connect With」はDBeaver
を選択します。 -
Generate Password
を押してファイルを取得しメモを取りましょう。 -
jdbc...
をコピー、メモを取りましょう。
1-2. DBeaverで接続
接続ウィザードから接続タイプでTiDBを検索し次へ。
- URL:
jdbc...
を貼り付け - ユーザー名: jdbc..のURL内にある
xxxxx.root
を貼り付け - パスワード: 取得したパスワードを貼り付け
接続しSQLが実行できました。
2. Python(SQLAlchemy)からのDB接続(2パターン目)
- 公式ドキュメント
- TiDB Serverless: v 7.1.1
- Python: 3.12.0
- SQLAlchemy: 2.0.27
- GitHub Sample: https://github.com/icck/tidb-python-sample
2-1. TiDB CloudでConnection情報を取得
- 「接続先」は
Public
、「Connect With」はGeneral
を選択します。
2-2. Pythonを実行する
以下、コードは行数を削って見やすくするために簡略化しています。
import os
from dotenv import load_dotenv
from sqlalchemy import URL, Column, Text, Uuid, create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
load_dotenv()
dsn = URL.create(
drivername="mysql+pymysql",
username=os.getenv("TIDB_USER", "root"),
password=os.getenv("TIDB_PASSWORD", ""),
host=os.getenv("TIDB_HOST", "127.0.0.1"),
port=int(os.getenv("TIDB_PORT", "4000")),
database=os.getenv("TIDB_DB_NAME", "test"),
)
connect_args = {
"ssl_verify_cert": True,
"ssl_verify_identity": True,
"ssl_ca": os.getenv("CA_PATH", ""),
}
engine = create_engine(dsn, connect_args=connect_args, pool_pre_ping=True)
Session = sessionmaker(bind=engine)
Base = declarative_base()
class User(Base):
__tablename__ = "users"
uuid = Column(Uuid, primary_key=True)
name = Column(Text, unique=True)
def sampleQuery():
with Session() as session:
result = session.query(User).all()
for user in result:
print(f"{user.uuid}, {user.name}")
if __name__ == "__main__":
sampleQuery()
実行結果、DBの値が出力されました。
b06a54e8-ce4c-11ee-9f44-0aebaf5b2e5a, Alice
b06a5549-ce4c-11ee-9f44-0aebaf5b2e5a, Bob
b06a5596-ce4c-11ee-9f44-0aebaf5b2e5a, Carol
b06a55cd-ce4c-11ee-9f44-0aebaf5b2e5a, Dave
b06a5606-ce4c-11ee-9f44-0aebaf5b2e5a, Ellen
動かしていてわかっている検討中の課題
いくつか、試せていない+調べきれていない都合上、記事にできていないものを列挙します。公式または他の記事を探すことができるかもしれません。(解決した場合は記事をUpdateしていきます)
AWSで動作させる場合の証明書について(解決済)
今回は、ローカルから接続していきますが、実際にはEC2
やFargate
からアクセスするようなイメージとなります。
証明書はローカルではなく、AWSで動かす場合、以下からダウンロードできるようですが、設定し動作はしていないので仮説が正しいのか検証が必要です。
<追記:2つ対応方法を教えていただいたいています>
- ConnectダイアログにてOSのディストリビューションに沿ったものを選択すれば良いとのことです。例えばAmazon Linuxであれば公式に公開はされていませんがRedHat系ディストリビューションだと言われていますので
CentOS
を指定すればCAファイルのパスを取得できます。つまり、Dockerを使う場合でもイメージのOSが何系ディストリビューションかを理解すれば対処出来るということになります。
- ConnectダイアログにてあえてWindowsを指定することで、CAファイルがダウンロードできるようになります。これを任意のPathに配置することでも解決できるそうなので、デプロイに混ぜ明示的にPath指定という選択をすることで解決することができます。
VPC内ではPublicではなくPrivateが推奨(解決済)
FargateやEC2などVPC内で動作する場合は、Private
を使いVPCLink
を推奨しているようでした。
推奨理由が現時点では理解できておらず、検証には至っていません。
<追記>
次の記事、TiDB CloudにAWSから接続してみる...PublicとPrivateどちらがよいのかを書きましたのでそちらで説明しています。
Lambdaでコネクション最適化しながら動作させる方法
Pythonでは、Lambdaで動かす方法を調べきれませんでした。AWSでいうRDSProxyを働かせるような実装方法が不明瞭だったため先に進めませんでした。
さいごに
実際にSQLツールやプログラムから動かすことができると、「いよいよ開発に使えるのかな?」と実感が湧いてきますね。本記事ではまだローカルからしか動かせていないのでAWSからも動かせるようになれたら良いなと思います、それはまた別の記事で。
何かの参考になれば幸いです。
Discussion