Docker Mysql 筆記

Steven Wang
2 min readOct 18, 2022

--

>>安裝docker
https://www.docker.com/get-started/
並啟動

>>檢查安裝是否正常
命令列 docker -v

>>拉取mysql映像檔
https://hub.docker.com/_/mysql
docker pull mysql

>>docker images檢查映像檔的存貨
docker images | grep mysql #只查看mysql

刪除映像
docker rmi ${IMAGE ID}
docker rmi 0716d6ebcc1a

>>運行docker容器
docker run — name sql2 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=XXXXXX -d mysql:8

參數功能:

run : docker 建立 container 並且執行的指令
— name : 指定容器為 sql2
-p 3306:3306 : 將容器的 3306 端口映射到主機的 3306 端口。
-e MYSQL_ROOT_PASSWORD=Dev127336 : 初始化 root 用戶的密碼為 Dev127336。
-d mysql:8 : 背景執行 MySQL 映像

>>檢查容器是否運行
docker ps

檢查容器 (全部)
docker ps -a

>>啟動容器
docker start sql1

>>進入容器
docker exec -it sql1 bash

登錄 mysql
mysql -u root -p

修改 Root 密碼
CREATE USER ‘帳號’@’%’ IDENTIFIED WITH mysql_native_password BY ‘密碼’;

GRANT : 權限設定
GRANT ALL PRIVILEGES ON *.* TO ‘帳號’@’%’;

退出容器
exit

刪除容器
docker rm sql1

>>DBeaver連結Mysql

Host : localhost
Port : 3306
Database : dbnane
Username : 帳號
Password : 密碼

命令列連結Mysql

Sqlalchemy 映射創建資料庫至Mysql

demo.py >> sqlalchemy創建資料庫

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
BASE = declarative_base()

class User(BASE):
__tablename__=’user’
id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
username = sa.Column(sa.String(64), unique=True)
password = sa.Column(sa.String(64))
email = sa.Column(sa.String(128), unique=True)
create_at = sa.Column(sa.DareTime, server_default=sa.func.now())

def __repr__(self): #for print
return “id={}, username={}, email={}”.format(self.id, self. Username, self. Email)

engine = sa.create_engine(“mysql+pymysql://root:root@localhost:3306/databasename”)
Session = sa.orm.sessionmaker(bind=engine) 這是一個函數不是實例

Base.metdata.create_all(engine)

先在命令列執行sql命令創建空的資料庫(create database databasename),再執行demo.py建立出資料庫

>>建立一對多關係

class User():
…略
tweets=relationship(‘Tweet’) #tweets不是欄位 Tweet是另一個關聯Class

class Tweet():
…略
user_id = Column(Integer, ForeignKey(‘user_id’)) #user_id欄位 關鍵字

多次創建不會影響資料庫結構,因為以上只管創建資料庫這件事

新增資料

user1 = User(username=’test1', password=’test1’, email=’test1@test1.com’) user2= User(username=’test2', password=’test2’, email=’test2@test2.com’)
user3= User(username=’test3', password=’test3’, email=’test3@test3.com’)
session = Session()
session.add(user1)
#session.add_all([user2, user3])
session. Commit()

>>對關聯資料表新增資料

s=Session()
u=User(username=’test1',password=’test1’,email=’test1@test1.com’)
s.add(u)
s.commit()

t=Tweet(tweet=’this i test’, user_id=1) #User要id=1的資料
s.add(t)
s.commit()
s.close()

方法二 先查詢是否存在id
u=s.query(User).filter(User.username==’test2').first()
if u:
t=Tweet(tweet=”this is test2',user_id=u.id)
s.add(t)
s.commit()
else:
print(‘iser does not exist’)

s.close()

查詢資料

class 加上__repr__ 打印(print)就會好看 才不會是user object
s=Session()
users=s.query(User) #select * #users為可迭代的對象 #一次性大量讀取但是在迭代的時候分次讀取出來
for u in users:
print(u)

s=Session()
users=s.query(User).filter(User.username == ‘test1’) #篩選
for u in users:
print(u)

s=Session()
users=s.query(User).order_by(User.id) #由小到大排序
for u in users:
print(u)

s=Session()
users=s.query(User).order_by(User.id.desc()) #由大到小排序
for u in users:
print(u)

>>用方法對session直接處理

s=Session()
users=s.query(User).all() #一次性大量讀取 數據量大將占用大量資源
print(users)

s=Session()
users=s.query(User).first()
print(users)

s=Session()
users=s.query(User).filter(User.username == ‘test1’).first()
print(users)

s=Session()
users=s.query(User).order_by(User.id.desc()).limit(3)
for u in users:
print(u)

users=s.query(User).order_by(User.id.desc()).limit(3).all()
print(users)
s.close() #關閉

>>返回指定欄位
s=Session()
u2=s.query(User.id, User.username)
for u in u2:
print(u)

>>filter的語法
query. filter(User.name == ‘ed’) # =
query. filter(User.name != ‘ed’) # !=
query. filter(User.name like ‘%ed%’) #like
query. filter(User.name sa.in_([‘ed,’wendy’,’jack’])) #in
query. filter(~User.name in_([‘’ed,’wendy’,’jack’])) #not in
query. filter(User.name==None) #Null
query. filter(User.name==None).filter(User.age==27) #and
query. filter(sa.or_(User.name==’ed’,User.name==’wendy’) #or

import sqlalchemy as sa #要import
s.query(Movie).filter(
sa.or_(Movie.actor_1_name == “Tom Hardy”, Movie.actor_2_name == “Tom Hardy”))

>>count and distinct

c1=s.query(movie).filter(Movie.director_name==’Christopher Nolan’).count()
print(c1)

c2=s.query(movie).filter(sa.or_(Movie.actor_1_name==’Tom Gardy’,Movie.actor_2_name==’Tom Hardy’).count()
print(c2)

c3=s.query(sa.distinct(Movie.director_name)).count()
c3=s.query(sa.distinct(Movie.director_name))
for i in c3:
print(i)

m1 = s.query(Movie.director_name, sa.func.count(Movie.title)).group_by(Movie.director_name).order_by(sa.func.count(Movie.title).desc()).limit(10)
print m in m1:
print(m)

m2 = s.query(Movie.director_name,sa.func.sum(Movie.gross)).group_by(Movie.director_name).order_by(sa.func.sum(Movie.gross).desc()).limit(10)
for m in m2:
print(m)

>>對關聯資料表查詢資料

s=Session()
u=s.query(User).filter(User.username==’test2’).first()
t=s.query(Tweet).filter(Tweet.user_id==u.id)
for tweet in t:
print(tweet)

>>join操作關聯資料表
mysql>select tweet from tweet inner join user on user.id=tweet.user_id where user. Username=’test2’;

說明select tweet[欄位] from tweet[table] inner join user[table] on user.id=tweet.user_id where user.username=’test2’;

ts=s.query(Tweet).join(User,User.id==Tweet.user_id).filter(User.username==’test2')
for t in ts:
print(t)

s.close()

說明join兩個條件
ts=s.query(Tweet).join(User,User.id==Tweet.user_id).filter(User.username==’test2')

更新資料

s=Session()
u=s.query(User).filter(User.username==’user1').first()
u.password=’test111’
u.email=’2222@111.com’
s.commit()

讀取json檔 輸入至sql
import json

class Movie(Base): …略

with open(‘movie.json’) as f:
movie_list = json.load(f)
for movie in movie_list:
m=Movie(**movie) #用class建立sql資料
s.add(m)

s.commit()

開發環境 SQL語句調適分析開關

engine = sa.create_engine(“mysql+pymysql://root:root@localhost:3306/databasename”,echo=True) #echo=True

--

--

Steven Wang
Steven Wang

No responses yet