#encoding: utf-8
from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func,and_,or_,ForeignKey
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship,backref
# 在Python3中才有這個enum模塊,在python2中沒有
import enum
from datetime import datetime
import random
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = '123456'
# dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
# 父表 / 從表
# user/article
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
username = Column(String(50),nullable=False)
def __repr__(self):
return "<User(username:%s)>" % self.username
# 上面的user是用戶表、下面的UserExtend表是用戶表的一些 不常用字段、比如學校、哪里人、這些字段、為了讓每一次數據庫讀取的時候省時間、把他單獨拿出來寫一個UserExtend,(User和UserExtend是一對一對應的uselist=False)
class UserExtend(Base):
__tablename__ = 'user_extend'
id = Column(Integer, primary_key=True, autoincrement=True)
school = Column(String(50))
uid = Column(Integer,ForeignKey("user.id"))
# (重點)uselist 默認是一個list 這樣他默認就是一對多、 寫成uselist=False就只能去一一對應
user = relationship("User",backref = backref("extend", uselist=False))
#添加一個用戶
class Article(Base):
__tablename__ = 'article'
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False)
content = Column(Text,nullable=False)
uid = Column(Integer,ForeignKey("user.id"))
author = relationship("User",backref="articles")
def __repr__(self):
return "<Article(title:%s,content:%s)>" % (self.title,self.content)
Base.metadata.drop_all()
Base.metadata.create_all()
# 一對多添加實例 70-80行
# #添加一個用戶
# user = User(username='小明')
#
# #添加兩個文章 多個文章
# article1 = Article(title = "xxxxxxxxxx",content = "222")
# article2 = Article(title = "eeeeeeee",content = "3333")
#
# #把文章的作者添加成小明 從一的一方添加文章
# user.articles.append(article1)
# user.articles.append(article2)
# session.add(user)
# session.commit()
#
# #一對多添加 從多的一方進行添加
# u1 = User(username = "書壘")
# article3 = Article(title = "aaaaaaaa",content = "*9999")
# article3.author = u1
# session.add(article3)
# session.commit()
# 這樣就實現了 一對一情況下的relationship的添加,主要要寫上 relationship 的屬性uselist=False
user = User(username='哇咔咔')
extend = UserExtend(school = "人民大學")
user.extend = extend
session.add(user)
session.commit()