程序员

用ORM操作MySQL

2018-04-02  本文已影响0人  小呉同学

ORM Object Relactional Mapping对象关系映射。
SQLAIchemy是一个数据库ORM框架。

工具的准备

初始化连接数据库

#从sqlalchemy中导入
# coding=gbk
from sqlalchemy import create_engine
from sqlalchemy import Column,Integer,String,DateTime,Boolean,Table,MetaData
#建立数据库连接,笔者连接的是数据库news
engine = create_engine('mysql://root:yourpasswd@127.0.0.1:3306/news')
#获取元数据
metadata = MetaData(engine)
#定义表中各项属性
news_0 = Table('news_0',metadata,Column('id',Integer,primary_key=True),Column('title',String(200),nullable=False),Column('content',String(2000),nullable=False),Column('types',String(10),nullable=False),Column('image',String(300), ),Column('author',String(20), ),Column('view_count',Integer),Column('created_at',DateTime),Column('is_valid',Boolean))
metadata.create_all()

声明映射

当使用ORM时,配置过程首先描述我们要处理的数据库表,然后通过定义我们自己的类映射到这些表。在现代的SQLAlchemy中,这两个任务通常一起执行,使用称为Declarative的系统,它允许我们创建包含指令的类来描述它们将要映射到的实际数据库表。

from sqlalchemy.ext.declarative import declarative_base
#创建对象基类
Base = declarative_base(engine)

现在我们有了一个“基础”,我们可以根据它定义任意数量的映射类。我们将从一个名为news_0的表开始,它将使用我们的应用程序存储最终用户的记录。被调用的新类News将是我们映射此表的类。在类中,我们定义了要映射到的表的详细信息,包括id,标题,内容,类别等:

class User(Base):
    #表的名称
    __tablename__='news_0'
    #表的结构
    id = Column(Integer,primary_key=True)
    title = Column(String(200),nullable=False)
    content = Column(String(2000),nullable=False)
    types = Column(String(10),nullable=False)
    image = Column(String(300), )
    author = Column(String(20), )
    view_count = Column(Integer)
    created_at = Column(DateTime)
    is_valid = Column(Boolean)

创建会话

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)

数据库的增、删、改、查

定义一个新类OrmTest

class OrmTest(object):
    def __init__(self):
        self.session = Session()
    #增加一条记录 
    def add_one(self):
        new_obj = User(
         title='标题',
         content='内容',
         types='网易'
        )
        self.session.add(new_obj)
        self.session.commit()
        return new_obj

    #查询一条记录 
    def get_one(self):
        return self.session.query(User).get(1)
    #查询多条记录
    def get_more(self):
        return self.session.query(User).filter_by(is_valid=True)
    
    def update_data(self, pk):
        #修改全部记录
        data_list = self.session.query(User).filter_by(is_valid=True)
        for item in data_list:
            #将所有内容的is_valid全改为0
            item.is_valid = 0
            self.session.add(item)
        self.session.commit()
        # new_obj = self.session.query(User).get(pk)    
        # if new_obj:
            # #修改一条记录
            # new_obj.is_valid = 1
            # self.session.add(new_obj)
            # self.session.commit()
            # return True
        # return False
    
    def delete_data(self, pk):
        #删除记录
        new_obj = self.session.query(User).get(pk)
        self.session.delete(new_obj)
        self.session.commit()

定义主函数

def main():
    obj = OrmTest()

    #添加记录 
    rest = obj.add_one()
    print(rest.id)

    #查询一条记录
    # rest = obj.get_one()
    # if rest:
        # print('ID:{0}=>{1}'.format(rest.id, rest.title))
    # else:
        # print('Not exist.')

    #查询多条记录 
    # rest = obj.get_more()
    # print(rest.count())
    # for new_obj in rest:
        # print('ID:{0}=>{1}'.format(new_obj.id, new_obj.title))
    
    #修改记录
    # print(obj.update_data(1))
    
    #删除记录
    #print(obj.delete_data(1))

实现

if __name__ == '__main__':
    main()
上一篇下一篇

猜你喜欢

热点阅读