Docker Mysql 筆記
>>安裝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