zoukankan      html  css  js  c++  java
  • Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式

    sqlalchemy的声明层ORM访问方式


    sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式

    主要的建立步骤包括:

                  1. 设置DSN连接网址;

                  2. 创建引擎,利用引擎对DSN进行连接;

                  3. 创建会话类并绑定到引擎,创建引擎实例;

                  4. 创建表类,由于使用声明层元数据;

                  5. 利用会话实例来进行数据库操作。

    基本连接关系图:

    下面是完整代码

     1 from sqlalchemy import create_engine, MetaData
     2 from sqlalchemy.ext.declarative import declarative_base
     3 from sqlalchemy.sql.schema import Table, Column
     4 from sqlalchemy.sql.sqltypes import Integer, VARCHAR
     5 from sqlalchemy.orm import sessionmaker
     6 
     7 Base = declarative_base()
     8 
     9 # Set DSN
    10 dsn = 'mysql+mysqldb://root:root@localhost/test_db'
    11 
    12 # Create engine, get connection
    13 eng = create_engine(dsn)
    14 cnx = eng.connect()
    15 
    16 # Make a Session class binded with engine
    17 Session = sessionmaker(bind=eng)
    18 # Generate a session instance
    19 session = Session()
    20 
    21 # Build up Table class
    22 class Test_tb(Base):
    23     __table__ = Table('test_tb', Base.metadata, 
    24                         Column('id', Integer, primary_key=True),
    25                         Column('name', VARCHAR(8))
    26                         )
    27 
    28 
    29 # Insert value
    30 # session.add_all([Test_tb(id=6, name='Momo')])
    31 session.add(Test_tb(id=6, name='Momo'))
    32 session.commit()
    33 
    34 # Delete value
    35 session.query(Test_tb).filter(Test_tb.id==6).delete()
    36 session.commit()
    37 
    38 session.add_all([Test_tb(id=7, name='Momo'), Test_tb(id=8, name='Kitkat')])
    39 session.commit()
    40 # Update value
    41 fr = session.query(Test_tb).filter_by(id=7).all()
    42 for f in fr:
    43     f.id = 9
    44 session.query(Test_tb).filter(Test_tb.id==8).delete()
    45 session.query(Test_tb).filter(Test_tb.id==9).delete()
    46 session.commit()
    47 
    48 re = session.query(Test_tb).all()
    49 # Show value: Each r is a row in table
    50 for r in re:
    51     print(r.__dict__)
    52 
    53 cnx.close()
    View Code

    分段分析

    首先导入所需的模块,创建声明层基类

     1 from sqlalchemy import create_engine, MetaData
     2 from sqlalchemy.ext.declarative import declarative_base
     3 from sqlalchemy.sql.schema import Table, Column
     4 from sqlalchemy.sql.sqltypes import Integer, VARCHAR
     5 from sqlalchemy.orm import sessionmaker
     6 
     7 Base = declarative_base()
     8 
     9 # Set DSN
    10 dsn = 'mysql+mysqldb://root:root@localhost/test_db'

    创建引擎,以及会话实例

    1 # Create engine, get connection
    2 eng = create_engine(dsn)
    3 cnx = eng.connect()
    4 
    5 # Make a Session class binded with engine
    6 Session = sessionmaker(bind=eng)
    7 # Generate a session instance
    8 session = Session()

    基于声明层创建表格类

    1 # Build up Table class
    2 class Test_tb(Base):
    3     __table__ = Table('test_tb', Base.metadata, 
    4                         Column('id', Integer, primary_key=True),
    5                         Column('name', VARCHAR(8))
    6                         )

    最后利用会话实例对表格进行操作

     1 # Insert value
     2 # session.add_all([Test_tb(id=6, name='Momo')])
     3 session.add(Test_tb(id=6, name='Momo'))
     4 session.commit()
     5 
     6 # Delete value
     7 session.query(Test_tb).filter(Test_tb.id==6).delete()
     8 session.commit()
     9 
    10 session.add_all([Test_tb(id=7, name='Momo'), Test_tb(id=8, name='Kitkat')])
    11 session.commit()
    12 # Update value
    13 fr = session.query(Test_tb).filter_by(id=7).all()
    14 for f in fr:
    15     f.id = 9
    16 session.query(Test_tb).filter(Test_tb.id==8).delete()
    17 session.query(Test_tb).filter(Test_tb.id==9).delete()
    18 session.commit()
    19 
    20 re = session.query(Test_tb).all()
    21 # Show value: Each r is a row in table
    22 for r in re:
    23     print(r.__dict__)
    24 
    25 cnx.close()

    最终运行结果

    {'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x000000000489F320>, 'id': 3, 'name': 'eric'}
    {'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x000000000489F390>, 'id': 5, 'name': 'mock'}

    相关阅读


    1. 显式的 ORM 访问方式

    2. ORM 与 sqlalchemy 模块

    3. 建立声明层表对象的两种方式

  • 相关阅读:
    MVC的异步,Entity Framework的异步,ADO.NET的异步,
    IE10、IE11 无法写入Cookie
    jQuery在IE浏览器上的html()报错 return !noData || noData !== true && elem.getAttribute("classid") === noData;
    站点、应用程序和虚拟目录详细介绍
    javascript中的一些核心知识点以及需要注意的地方
    $.browser.msie 报错 null
    【转】虚拟机安装Ubuntu的上网设置(有线网络和无线网络)
    Linux编程(获取系统时间)
    【Java】解析xml
    【Java】多线程
  • 原文地址:https://www.cnblogs.com/stacklike/p/8192919.html
Copyright © 2011-2022 走看看