Flask-SQLAichemy一二

一、ORM操作

  创建数据库表

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer,String,Text,Date,DateTime
from sqlalchemy import create_engine

Base = declarative_base()

########## 构建表结构
class Users(Base):
    __tablename__='users'

    id = Column(Integer,primary_key=True)
    name = Column(String(32),nullable=False,index=True)
    # email = Column(String(32), unique=True)
    # ctime = Column(DateTime, default=datetime.datetime.now)
    # extra = Column(Text, nullable=True)


########### 链接数据库创建表
def create_table():
    engine = create_engine(
        "mysql+pymysql://root:111111@127.0.0.1:3306/sqlarchemy01?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)(-1代表一次也不回收)
    )
    Base.metadata.create_all(engine)


def drop_all():
    engine = create_engine(

        "mysql+pymysql://root:111111@127.0.0.1:3306/sqlarchemy01?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)(-1代表一次也不回收)
    
    )

    Base.metadata.drop_all(engine)

if __name__ == '__main__':
    create_table()
    # drop_all()
创建单表
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import datetime
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
from sqlalchemy.orm import relationship

Base = declarative_base()


# ##################### 单表示例 #########################
class Users(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True)
    age = Column(Integer, default=18)
    email = Column(String(32), unique=True)
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text, nullable=True)

    __table_args__ = (
        # UniqueConstraint('id', 'name', name='uix_id_name'),
        # Index('ix_id_name', 'name', 'extra'),
    )


class Hosts(Base):
    __tablename__ = 'hosts'

    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True)
    ctime = Column(DateTime, default=datetime.datetime.now)


# ##################### 一对多示例 #########################
class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='篮球')


class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    hobby_id = Column(Integer, ForeignKey("hobby.id"))

    # 与生成表结构无关,仅用于查询方便
    hobby = relationship("Hobby", backref='pers')


# ##################### 多对多示例 #########################

class Server2Group(Base):
    __tablename__ = 'server2group'
    id = Column(Integer, primary_key=True, autoincrement=True)
    server_id = Column(Integer, ForeignKey('server.id'))
    group_id = Column(Integer, ForeignKey('group.id'))


class Group(Base):
    __tablename__ = 'group'
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)

    # 与生成表结构无关,仅用于查询方便
    servers = relationship('Server', secondary='server2group', backref='groups')


class Server(Base):
    __tablename__ = 'server'

    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(64), unique=True, nullable=False)


def init_db():
    """
    根据类创建数据库表
    :return: 
    """
    engine = create_engine(
        "mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )

    Base.metadata.create_all(engine)


def drop_db():
    """
    根据类删除数据库表
    :return: 
    """
    engine = create_engine(
        "mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )

    Base.metadata.drop_all(engine)


if __name__ == '__main__':
    drop_db()
    init_db()
创建多个表并包含Fk、M2M关系

  操作数据库表

  增加:

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine


from models import Users

engine = create_engine("mysql+pymysql://root:111111@127.0.0.1:3306/sqlarchemy01?charset=utf8",
                       max_overflow=0,
                       pool_size=5,
                       pool_timeout=30,
                       pool_recycle=-1
                       )
Session = sessionmaker(bind=engine)

# 根据user类对user表进行增删改查
# 每次执行数据库操作时,都需要创建一个session
session = Session()

# ############# 执行ORM操作 #############
#1 增加
###单条记录
# obj = Users(name='alex')
# session.add(obj)
# 提交事务
# session.commit()
# 关闭session
# session.close()

#######多条记录
session.add_all([
     Users(name='amy'),
     Users(name='luoluo')
 ])
 session.commit()
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine


from models import Users

engine = create_engine("mysql+pymysql://root:111111@127.0.0.1:3306/sqlarchemy01?charset=utf8",
                       max_overflow=0,
                       pool_size=5,
                       pool_timeout=30,
                       pool_recycle=-1
                       )
Session = sessionmaker(bind=engine)

# 根据user类对user表进行增删改查
# 每次执行数据库操作时,都需要创建一个session
session = Session()

# ############# 执行ORM操作 #############

# 2 查
result = session.query(Users).all()
for row in result:
    print(row.id,row.name)

# result = session.query(Users).filter(Users.id >=2)
# for i in result:
#     print(i.name)

# 3 删
# session.query(Users).filter(Users.id>2).delete()
# session.commit()


# 4 改
# session.query(Users).filter(Users.id == 1).update({Users.name:'luo'})
# session.commit()

# session.query(Users).filter(Users.id == 2).update({Users.name:'amylee'+'ok'},synchronize_session=False)
# session.commit()
删改查

 

posted @ 2018-06-20 16:50  amyleell  阅读(492)  评论(0编辑  收藏  举报