目前,许多主流的语言,都实现了对象关系映射(ORM Object Relational Mapper)的库包。
ORM的主要功能是将数据库表中的每条记录映射成一个对象。所有的数据库操作,都转化为对象的操作。这样可以增加代码的可读性和安全性。当然性能上会低于直接执行sql命令
。本文介绍Sqlalchemy的ORM操作。Sqlalchemy的版本需要在1.1以上。
有了这个基类,就可以为users表定义model类了。
上面的代码中,__tablename__类成员变量指明了User类对应的是数据库的users表。后面的3个类成员变量都是Column对象,分别对应表的三个域(field)。
代码中session.query方法会返回一个Query对象。此后,调用Query对象的filter_by方法进行查询。它返回的依然是Query对象。最后调用Query对象的first方法获得查询记录的第1条记录。如果查询记录为空,则返回None。
在执行后面的代码前,请保证已经根据上一篇博文的介绍创建好了名为users的表格。
在ORM中,数据库的每张表,都对应一个model类。而这些model类都需要继承一个名为declarative base class的基类。我们需要通过下面的代码来获得这个基类。
- from sqlalchemy.ext.declarative import declarative_base
- BASE = declarative_base()
有了这个基类,就可以为users表定义model类了。
- class User(BASE):
- __tablename__ = "users"
- id = Column(INTEGER, primary_key=True)
- name = Column(CHAR(127))
- password = Column(CHAR(127))
上面的代码中,__tablename__类成员变量指明了User类对应的是数据库的users表。后面的3个类成员变量都是Column对象,分别对应表的三个域(field)。
注意:默认情况下,User中Column对象的名字与数据库表field的名字相一致。如果两者不一致时,需要在Column对象的构造方法中传入name参数。
添加记录
下面的代码介绍了往数据库表添加记录的方法。
- from sqlalchemy.orm import sessionmaker
- from sqlalchemy import create_engine
- ENGINE = create_engine("mysql://root:zaq12wsx@localhost:3306/mydb?charset=utf8",
- convert_unicode=True)
- Session = sessionmaker(bind=ENGINE, autocommit=False, autoflush=False)
- session = Session()
- user = User()
- user.name = "user1"
- user.password = "password"
- session.add(user)
- session.commit()
代码第4-8行是用来创建session对象。注意我们把session对象的自动提交功能禁用了。
代码第10-12行创建了一个User对象。这个对象有3个成员变量,即id, name和password。与三个User类中三个Column对象的类成员变量名字一致。
代码第14行,是将新建的user对象添加进来。但是注意,由于session的自动提交功能禁用了,所在执行完这行代码以后,数据库并没有真正更新。直到第15行代码执行完毕后,才会真正更新数据库。
下面是数据库的更新结果。
- mysql> select * from users;
- +----+-------+----------+
- | id | name | password |
- +----+-------+----------+
- | 1 | user1 | password |
- +----+-------+----------+
- 1 row in set (0.00 sec)
查询记录
- user = session.query(User).filter_by(name="user1").first()
- print "%s %s" % (user.name, user.password)
更新记录
- user = session.query(User).filter_by(name="user1").first()
- user.password = "newpassword"
- session.commit()
- user = session.query(User).filter_by(name="user1").first()
- session.delete(user)
- session.commit()