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


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


在执行后面的代码前,请保证已经根据上一篇博文的介绍创建好了名为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)
代码中session.query方法会返回一个Query对象。此后,调用Query对象的filter_by方法进行查询。它返回的依然是Query对象。最后调用Query对象的first方法获得查询记录的第1条记录。如果查询记录为空,则返回None。


更新记录

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()




你可能感兴趣的:(Python)