|
|
- from sqlalchemy import create_engine,MetaData
- from sqlalchemy import Integer,String,ForeignKey,Column,TEXT,LargeBinary
- from sqlalchemy.orm import relationship
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy.orm import sessionmaker
- from sqlalchemy import PrimaryKeyConstraint,UniqueConstraint
- import sqlalchemy
- import re
- import time
- import jieba.analyse
- from jieba import cut_for_search
-
- Base=declarative_base()
- class con:
- def connect():
- '''Returns a connection and a metadata object'''
- # We connect with the help of the PostgreSQL URL
-
- url = 'postgresql://stu10205501415:Stu10205501415@dase-cdms-2022-pub.pg.rds.aliyuncs.com:5432/stu10205501415'
-
- # The return value of create_engine() is our connection object
- con = create_engine(url, client_encoding='utf8')
-
- # We then bind the connection to MetaData()
- meta = MetaData(bind=con)
-
- return con, meta
-
-
- class User(Base):
- __tablename__ = 'user'
- user_id = Column(TEXT, primary_key=True, comment="主键")
- password = Column(TEXT, nullable=False, comment="密码")
- balance = Column(Integer, nullable=False, comment="")
- token = Column(TEXT, comment="缓存的令牌")
- terminal = Column(TEXT, comment="终端代码")
-
- # class Store(Base):
- # __tablename__ = 'store'
- # store_id = Column(TEXT, primary_key=True,comment="主键")
- # stock_level = Column(Integer, comment = "货存")
-
- class Store_Book(Base):
- __tablename__ = 'store_book'
- store_id = Column(TEXT, comment="主键")
- book_id = Column(TEXT, comment="主键")
- book_info = Column(TEXT, comment="书籍信息")
- stock_level = Column(Integer, comment = "货存")
-
- __table_args__ = (
- PrimaryKeyConstraint('store_id', 'book_id'),
- )
-
- class User_Store(Base):
- __tablename__ = 'user_store'
-
- # id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
-
- user_id = Column(
- TEXT,
- # ForeignKey(
- # "user.user_id",
- # ondelete="CASCADE",
- # onupdate="CASCADE",
- # ),
- nullable=False,
- comment="user外键"
- )
- store_id = Column(
- TEXT,
- # ForeignKey(
- # "store.store_id",
- # ondelete="CASCADE",
- # onupdate="CASCADE",
- # ),
- nullable=False,
- comment="store外键"
- )
- # 多对多关系的中间表必须使用联合唯一约束,防止出现重复数据
- __table_args__ = (
- PrimaryKeyConstraint('store_id', 'user_id'),
- )
-
- class New_Order(Base):
- __tablename__ = 'new_order'
- order_id = Column(TEXT, primary_key = True, comment = '订单id')
-
- user_id = Column(
- TEXT,
- ForeignKey(
- "user.user_id",
- ondelete="CASCADE",
- onupdate="CASCADE",
- ),
- nullable=False,
- comment="user外键"
- )
- store_id = Column(
- TEXT,
- # ForeignKey(
- # "store.store_id",
- # ondelete="CASCADE",
- # onupdate="CASCADE",
- # ),
- nullable=False,
- comment="store外键"
- )
- creat_time = Column(TEXT, nullable=False,comment="订单创建时间")
- status = Column(Integer,nullable=False,comment="订单状态")
-
- class New_Order_Detail(Base):
- __tablename__ = 'new_order_detail'
- order_id = Column(TEXT, comment='订单id')
- book_id = Column(TEXT, comment='订单书籍')
- count = Column(Integer, comment='购买书籍数')
- price = Column(Integer, comment='单价')
-
- __table_args__ = (
- PrimaryKeyConstraint('order_id','book_id'),
- )
-
- class Book(Base):
- __tablename__ = 'book'
- book_id = Column(TEXT, primary_key=True)
- title = Column(TEXT, nullable=False)
- author = Column(TEXT)
- publisher = Column(TEXT)
- original_title = Column(TEXT)
- translator = Column(TEXT)
- pub_year = Column(TEXT)
- pages = Column(Integer)
- original_price = Column(Integer) # 原价
- currency_unit = Column(TEXT)
- binding = Column(TEXT)
- isbn = Column(TEXT)
- author_intro = Column(TEXT)
- book_intro = Column(TEXT)
- content = Column(TEXT)
- tags = Column(TEXT)
- picture = Column(LargeBinary)
-
-
- # 搜索标题表
- class Search_title(Base):
- __tablename__ = 'search_title'
- search_id = Column(Integer, nullable=False)
- title = Column(TEXT, nullable=False)
- book_id = Column(TEXT, ForeignKey('book.book_id'), nullable=False)
-
- __table_args__ = (
- PrimaryKeyConstraint('search_id', 'title'),
- {},
- )
-
-
- # 搜索标签表
- class Search_tags(Base):
- __tablename__ = 'search_tags'
- search_id = Column(Integer, nullable=False)
- tags = Column(TEXT, nullable=False)
- book_id = Column(TEXT, ForeignKey('book.book_id'), nullable=False)
-
- __table_args__ = (
- PrimaryKeyConstraint('search_id', 'tags'),
- {},
- )
-
-
- # 搜索作者表
- class Search_author(Base):
- __tablename__ = 'search_author'
- search_id = Column(Integer, nullable=False)
- author = Column(TEXT, nullable=False)
- book_id = Column(TEXT, ForeignKey('book.book_id'), nullable=False)
-
- __table_args__ = (
- PrimaryKeyConstraint('search_id', 'author'),
- {},
- )
-
-
-
-
- # 搜索书本内容表
- class Search_book_intro(Base):
- __tablename__ = 'search_book_intro'
- search_id = Column(Integer, nullable=False)
- book_intro = Column(TEXT, nullable=False)
- book_id = Column(TEXT, ForeignKey('book.book_id'), nullable=False)
-
- __table_args__ = (
- PrimaryKeyConstraint('search_id', 'book_intro'),
- {},
- )
-
-
- def insert_tags(session):
- row = session.query(Book).all()
- for i in row:
- tags = i.tags
- for j in tags:
- row_tmp = session.query(Search_tags).filter(Search_tags.tags==j).order_by(Search_tags.search_id.desc()).first()
- if row_tmp is None:
- max_num = 0
- else:
- max_num = row_tmp.search_id + 1
- new_search_tags = Search_tags(search_id=max_num,tags=j,book_id=i.book_id)
- session.add(new_search_tags)
- session.commit()
-
-
- def insert_author(session):
- row = session.query(Book).all()
- for i in row:
- tmp = i.author
- if tmp == None:
- j = '作者不详'
- else:
- j = tmp
- row_tmp = session.query(Search_author).filter(Search_author.author==j).order_by(Search_author.search_id.desc()).first()
- if row_tmp is None:
- max_num = 0
- else:
- max_num = row_tmp.search_id + 1
- # print(max_num, j, i.book_id)
- new_search_author = Search_author(search_id=max_num,author=j,book_id=i.book_id)
- session.add(new_search_author)
- session.commit()
-
- def insert_title(session):
- row = session.query(Book).all()
- for i in row:
- tmp = i.title
- # print(tmp)
- tmp = re.sub(r'[\(\[\{(【][^))】]*[\)\]\{\】\)]\s?', '', tmp)
- tmp = re.sub(r'[^\w\s]', '', tmp)
- # 处理空标题
- if len(tmp) == 0:
- continue
-
- # 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- seg_list = cut_for_search(tmp)
- sig_list = []
- tag = 0
- for k in seg_list:
- sig_list.append(k)
- if k == tmp:
- tag = 1
- if tag == 0:
- sig_list.append(tmp)
-
- for j in sig_list:
- if j == "" or j == " ":
- continue
-
- row_tmp = session.query(Search_title).filter(Search_title.title==j).order_by(Search_title.search_id.desc()).first()
- if row_tmp is None:
- max_num = 0
- else:
- max_num = row_tmp.search_id + 1
- # print(max_num, j, i.book_id)
- new_search_title = Search_title(search_id=max_num,title=j,book_id=i.book_id)
- session.add(new_search_title)
- session.commit()
-
- def insert_book_intro(session):
- row = session.query(Book).all()
- for i in row:
- tmp = i.book_intro
- if tmp != None:
- # print(tmp)
- # 采用textrank进行分词
- keywords_textrank = jieba.analyse.textrank(tmp)
- # print(keywords_textrank)
- # keywords_tfidf = jieba.analyse.extract_tags(tmp)
- # print(keywords_tfidf)
- for j in keywords_textrank:
-
- row_tmp = session.query(Search_book_intro).filter(Search_book_intro.book_intro==j).order_by(Search_title.search_id.desc()).first()
- if row_tmp is None:
- max_num = 0
- else:
- max_num = row_tmp.search_id + 1
- # print(max_num, j, i.book_id)
- new_search_book_intro = Search_book_intro(search_id=max_num,book_intro=j,book_id=i.book_id)
- session.add(new_search_book_intro)
- session.commit()
-
-
-
-
-
- engine, meta = con.connect()
-
- Base.metadata.bind = engine
-
- DBSession = sessionmaker(bind=engine)
-
- session = DBSession()
-
- insert_tags(session=session)
- insert_author(session=session)
- insert_title(session=session)
- insert_book_intro(session=session)
|