sqlalchemy学习(四)ORM model及数据库表的增删改查

目前,许多主流的语言,都实现了对象关系映射(ORM Object Relational Mapper)的库包。 ORM的主要功能是将数据库表中的每条记录映射成一个对象。所有的数据库操作,都转化为对象的操作。这样可以增加代码的可读性和安全性。当然性能上会低于直接执行sql命令 。本文介绍Sqlalchemy的ORM操作。Sqlalchemy的版本需要在1.1以上。


在执行后面的代码前,请保证已经根据上一篇博文的介绍创建好了名为users的表格。


在ORM中,数据库的每张表,都对应一个model类。而这些model类都需要继承一个名为declarative base class的基类。我们需要通过下面的代码来获得这个基类。


[python]  view plain  copy
  1. from sqlalchemy.ext.declarative import  declarative_base  
  2.   
  3. BASE = declarative_base()  



有了这个基类,就可以为users表定义model类了。

[python]  view plain  copy
  1. class User(BASE):  
  2.     __tablename__ = "users"  
  3.   
  4.     id = Column(INTEGER, primary_key=True)  
  5.     name = Column(CHAR(127))  
  6.     password = Column(CHAR(127))  

上面的代码中,__tablename__类成员变量指明了User类对应的是数据库的users表。后面的3个类成员变量都是Column对象,分别对应表的三个域(field)。


注意:默认情况下,User中Column对象的名字与数据库表field的名字相一致。如果两者不一致时,需要在Column对象的构造方法中传入name参数。


添加记录


下面的代码介绍了往数据库表添加记录的方法。

[python]  view plain  copy
  1. from sqlalchemy.orm import sessionmaker  
  2. from sqlalchemy import create_engine  
  3.   
  4. ENGINE = create_engine("mysql://root:zaq12wsx@localhost:3306/mydb?charset=utf8",  
  5.                            convert_unicode=True)  
  6. Session = sessionmaker(bind=ENGINE, autocommit=False, autoflush=False)  
  7.   
  8. session = Session()  
  9.   
  10. user = User()  
  11. user.name = "user1"  
  12. user.password = "password"  
  13. session.add(user)  
  14. session.commit()  

代码第4-8行是用来创建session对象。注意我们把session对象的自动提交功能禁用了。

代码第10-12行创建了一个User对象。这个对象有3个成员变量,即id, name和password。与三个User类中三个Column对象的类成员变量名字一致。

代码第14行,是将新建的user对象添加进来。但是注意,由于session的自动提交功能禁用了,所在执行完这行代码以后,数据库并没有真正更新。直到第15行代码执行完毕后,才会真正更新数据库。


下面是数据库的更新结果。


[plain]  view plain  copy
  1. mysql> select * from users;  
  2. +----+-------+----------+  
  3. | id | name  | password |  
  4. +----+-------+----------+  
  5. |  1 | user1 | password |  
  6. +----+-------+----------+  
  7. 1 row in set (0.00 sec)  


查询记录


[python]  view plain  copy
  1. user = session.query(User).filter_by(name="user1").first()  
  2. print "%s %s" % (user.name, user.password)  
代码中session.query方法会返回一个Query对象。此后,调用Query对象的filter_by方法进行查询。它返回的依然是Query对象。最后调用Query对象的first方法获得查询记录的第1条记录。如果查询记录为空,则返回None。


更新记录

[python]  view plain  copy
  1. user = session.query(User).filter_by(name="user1").first()  
  2. user.password = "newpassword"  
  3. session.commit()  


删除记录

[python]  view plain  copy
  1. user = session.query(User).filter_by(name="user1").first()  
  2. session.delete(user)  
  3. session.commit()  

猜你喜欢

转载自blog.csdn.net/ialexanderi/article/details/80163536