SQLAlchemy 小练习(书、作者与小三)

一、一对一表操作

一对一表操作,实例数据表

1、创建数据库连接,并创建相关的数据表

from sqlalchemy import create_engine,Column,String,Integer,ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 生成数据库基类
Base = declarative_base()

global engine

def create_connect(username,password,DB_host,DB_port,DB_name,charset="utf8"):
    global engine
    # 注意操作数据库的模块,pymysql 或者 mysqldb 需要安装
    data_connect = "mysql+pymysql://%s:%s@%s:%s/%s?charset=%s" % \
    (username,password,DB_host,DB_port,DB_name,charset,) 
    print(data_connect) # mysql+pymysql://root:[email protected]:3306/flask_sql?charset=utf8
    engine = create_engine(data_connect,echo=True,pool_size=5,
    			             pool_timeout=30,pool_recycle=-1,max_overflow=5,encoding='utf8')
    Base.metadata.create_all(engine)

# 创建数据库会话函数
def loadSession():
    Session = sessionmaker(bind=engine)
    session = Session()
    return session

class Book(Base):
	# 创建书表
    __tablename__ = 'books'
    bid = Column(Integer,nullable=False,autoincrement=True,primary_key=True)
    title = Column(String(120),nullable=False) # title 不能为空,False表示不为空,True可以为空
    author_id = Column(Integer, ForeignKey('authors.aid')) # 通过Foreignkey指定外键管理
	# PS:指定ForeignKey必须有primary_key

class Author(Base):
	# 创建作者表
    __tablename__ = 'authors'
    aid = Column(Integer,nullable=False,autoincrement=True,primary_key=True)
    name = Column(String(64),nullable=False)	

if __name__ == '__main__':
    create_connect('root','root','127.0.0.1',3306,'flask_sql') # 调用创建数据库连接函数,并创建表
    session = loadSession() # 调用会话函数创建数据库会话

2、为各表创建数据

# 添加‘books’数据
b1 = Book(title='神雕侠侣',author_id=1)
b2 = Book(title='碧血剑',author_id=1)
b3 = Book(title='盗墓笔记',author_id=2)
a1 = Author(name='金庸')
a2 = Author(name='南派三叔')
# 单个方式添加
# session.add(b1)
# session.add(b2)

# 多个方式添加
session.add_all([b1,b2,b3,a1,a2])
session.commit()

3、数据库查询

# 查询
# 1、查询所有的书籍
# book_list = session.query(Book).all()
# book_list = session.query(Book).first()
# 2、查找作者为"金庸"的书籍
# book = session.query(Book.title).filter(Author.name=='金庸',Author.aid == Book.author_id).all()
# 3、查找所有的作者和书籍
# book = session.query(Book,Author).join(Author,Author.aid == Book.author_id).all()
# 4、根据 Book.bid 进行排序
book = session.query(Book,Author).join(Author,Author.aid == Book.author_id).order_by(Book.bid).all()
print(book)
for books in book:
    print(books[0].bid,books[0].title,books[1].aid,books[1].name)

session.close()

二、多对多操作(M2M)

多表操作

1、创建数据库连接,并创建相关的数据表

from sqlalchemy import create_engine,Column,String,Integer,ForeignKey,UniqueConstraint
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

global engine

def create_connect(username,password,DB_host,DB_port,DB_name,charset="utf8"):
    global engine
    data_connect = "mysql+pymysql://%s:%s@%s:%s/%s?charset=%s" % \
                   (username,password,DB_host,DB_port,DB_name,charset,)
    print(data_connect)
    engine = create_engine(data_connect,echo=True,pool_size=5,
                           pool_timeout=30,pool_recycle=-1,max_overflow=5,encoding='utf8')
    Base.metadata.create_all(engine)


def loadSession():
    Session = sessionmaker(bind=engine)
    session = Session()
    return session

class Author(Base):
	# 作者表
    __tablename__ = 'authors'
    aid = Column(Integer,nullable=False,autoincrement=True,primary_key=True)
    name = Column(String(64),nullable=False)

class Book(Base):
	# 书籍表
    __tablename__ = 'books'
    bid = Column(Integer,nullable=False,autoincrement=True,primary_key=True)
    title = Column(String(120),nullable=False)
    authors = relationship('Author',secondary='book2author',backref='books')
    # 通过relationship关系“books”表与“author”表,这样就可以通过对向的数据表获取相互的数据信息

class Book2Author(Base):
	# 通过id关联书籍与作者
    __tablename__ = 'book2author'
    id = Column(Integer,nullable=False,autoincrement=True,primary_key=True)
    book_id = Column(Integer,ForeignKey('books.bid'))
    author_id = Column(Integer,ForeignKey('authors.aid'))
    __table_args__ = (
        UniqueConstraint('book_id','author_id',name='uix_book_author'),# 创建唯一索引信息
    )

2、创建数据、获取对应信息

if __name__ == '__main__':
    create_connect('root','root','127.0.0.1',3306,'flask_sql')
    session = loadSession()

    # 创建一个书的作者并关联两本书
    # author_book = Author(name='金庸')
    # author_book.books = [Book(title='神雕侠侣'),Book(title='书剑恩仇录')]
    # session.add(author_book)
    # session.commit()
    # jy = Book2Author(book_id=1,author_id=1)
    # session.add(jy)
    # session.commit()
    # 1.把作者表中id=2的作者修改为'古龙'
    # upauthor = session.query(Author).filter(Author.aid == 2).update({Author.name: '古龙'})
    # session.commit()
    # 2.查询所有的作者和数据
    # book_author = session.query(Book,Author).all()
    # print(book_author)
    # for item in book_author:
    #     print(item[0].bid,item[0].title,item[1].aid,item[1].name)
    # 3.查询"古龙"写的书籍
    # book = session.query(Book,Author).filter(Book2Author.author_id == Author.aid,
    #                          Book2Author.book_id == Book.bid,Author.name == '古龙').all()
    # print(book)
    # 4.通过作者取书的名字,relationship backref 反查获取书信息
    # author_book = session.query(Author).filter(Author.name == '古龙').first()
    # print(author_book.books[0].title,author_book.books[1].title)
    # 5.通过书名查看取作者,relationship 返回值 authors 获取作者信息
    book_author = session.query(Book).filter(Book.bid == 2).first()
    print(book_author.authors[0].name)

    session.close()

三、执行原生SQL

数据库SQL语句

# 查找
cursor = session.execute('sql语句')
result = cursor.fetchall()
# 添加
cursor = session.execute('sql语句')
session.commit()
print(cursor.lastrowid)
# 交还连接池
session.remove()

猜你喜欢

转载自blog.csdn.net/u011146423/article/details/84850701