Python的ORM框架SQLObject入门实例
SQLObject是一个Python的ORM(Object-Relational Mapping)框架,可以让你像操作对象一样操作数据库。
安装SQLObject
使用pip安装SQLObject:
pip install sqlobject
连接数据库
在使用SQLObject之前,需要先建立连接。SQLObject支持SQLite、MySQL、PostgreSQL等多种数据库,下面以SQLite为例。
import sqlobject
sqlobject.sqlhub.processConnection = sqlobject.connectionForURI('sqlite:/:memory:')
这里我们使用SQLite in-memory模式,将连接设置为了全局变量。连接字符串的格式为:<database type>://<user>:<password>@<host>/<database name>
。在这个例子中,我们省略了用户名、密码和主机等信息,直接使用了sqlite:/
,表示连接一个sqlite数据库,memory:
表示使用内存数据库。
定义表结构及相关操作
下面我们需要定义一个数据表,并在其中添加数据。
import sqlobject
from sqlobject import SQLObject, connectionForURI, sqlhub
from datetime import datetime
sqlhub.processConnection = connectionForURI('sqlite:/:memory:')
# 定义数据结构
class User(SQLObject):
username = sqlobject.StringCol(length=50, unique=True)
password = sqlobject.StringCol(length=50)
email = sqlobject.StringCol(length=50, unique=True)
birthday = sqlobject.DateCol(default=datetime(1970, 1, 1), notNone=False)
# 创建表
User.createTable()
# 添加数据
User(username='Tom', password='123456', email='tom@example.com', birthday=datetime(1990, 1, 1))
User(username='Alice', password='654321', email='alice@example.com', birthday=datetime(1980, 1, 1))
# 查询数据
users = User.select()
for user in users:
print(user.username, user.password, user.email, user.birthday)
这里我们定义了一个User
类,并使用SQLObject的数据类型StringCol
和DateCol
定义了每个字段的类型,使用unique=True
表示该字段必须是唯一的。然后通过User.createTable()
创建了User
表。接着,我们使用User
类创建了两条数据,并使用User.select()
查询了所有用户,并打印出来。
多对一、一对多关系
SQLObject允许定义数据之间的关系,下面我们将定义一对多和多对一的两种关系。
多对一
多对一使用ForeignKey来定义外键。
class BankAccount(SQLObject):
account_number = sqlobject.StringCol(50)
user = sqlobject.ForeignKey('User', cascade=True)
BankAccount.createTable()
这里我们在BankAccount
表中定义了一个user
字段,使用了ForeignKey
关键字,并将关联的表设置为User
。使用cascade=True
表示在删除用户时级联删除其对应的银行账户。
一对多
对于一对多的关系,则是定义一个MultipleJoin属性。
class Order(SQLObject):
order_number = sqlobject.StringCol(50)
user = sqlobject.ForeignKey('User', cascade=True)
class Product(SQLObject):
name = sqlobject.StringCol(50)
class OrderItem(SQLObject):
order = sqlobject.ForeignKey('Order', cascade=True)
product = sqlobject.ForeignKey('Product')
quantity = sqlobject.IntCol()
@property
def price(self):
return self.product.price * self.quantity
Order.createTable()
Product.createTable()
OrderItem.createTable()
其中,Order
表和Product
表没有任何关系,但是OrderItem
表定义了两个外键,一个是Order
,另一个是Product
,并且使用了MultipleJoin
属性来表示这是一个多对一的关系。我们还定义了一个@property
装饰器,用来计算订单项的价格。
示例1:将结果转化为JSON格式
SQLObject返回的结果是对象,如果要将其转化为JSON格式,可以使用以下代码:
import json
users = User.select()
user_dicts = [user.toDict() for user in users]
json_data = json.dumps(user_dicts)
print(json_data)
这里先使用User.select()
查询了所有用户,然后通过toDict()
方法将每个用户转化为一个字典,最后使用json.dumps()
将整个列表转化为JSON字符串。
示例2:使用SQLExpression查询
除了ORM的常规操作外,SQLObject还支持使用SQL语句查询,可以使用SQLExpression
类来构建查询语句。
from sqlobject.sqlbuilder import AND, IN
from sqlobject.sqlbuilder import SELECT, LIKE, LEFTJOINOn
users = SELECT([User.q.username, User.q.email],
WHERE=AND(LIKE(User.q.username, 'T%'), IN(User.q.email, ('tom@example.com', 'alice@example.com'))),
FROM=User)
for user in users:
print(user)
这里我们使用了SELECT
函数来构建查询语句,使用AND
和IN
来构建查询条件。其中LIKE(User.q.username, 'T%')
表示查询用户名以"T"开头的用户,IN(User.q.email, ('tom@example.com', 'alice@example.com'))
表示查询邮箱为'tom@example.com'或'alice@example.com'的用户。使用LEFTJOINOn
可以连接多张表查询。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python的ORM框架SQLObject入门实例 - Python技术站