基于pandas数据帧的orm
jardin的Python项目详细描述
jardin是基于pandas.DataFrame的面向python应用程序的orm。
开始
在工作目录(应用的根目录)中,创建名为 jardin_conf.py:
# jardin_conf.pyDATABASES={'my_first_database':'https://username:password@database.url:port','my_second_database':'https://username:password@database.url:port'}LOG_LEVEL=logging.DEBUGWATERMARK='My Great App'
然后,在您的应用程序中,假设您有一个名为users:
的表# app.pyimportjardinclassUser(jardin.Model):db_names={'read':'my_first_database','write':'my_second_database'}
在控制台中:
>>>fromappimportUsers>>>users=User.last(4)# /* My Great App */ SELECT * FROM users ORDER BY u.created_at DESC LIMIT 4;>>>usersidnameemail...0Johnjohn@beatl.es...1Paulpaul@beatl.es...2Georgegeorge@beatl.es...3Ringoringo@beatl.es...
结果对象是pandas数据帧:
>>>importpandas>>>isinstance(users,pandas.DataFrame)True>>>isinstance(users,jardin.Collection)True
查询
选择查询
下面是从数据库中选择记录的基本语法
>>>users=User.select(select=['id','name'],where={'email':'paul@beatl.es'},order='id ASC',limit=1)# /* My Great App */ SELECT u.id, u.name FROM users u WHERE u.email = 'paul@beatl.es' ORDER BY u.id ASC LIMIT 1;>>>usersidname1Paul
参数
- select–要返回的列列表。如果没有提供,所有 将返回列。
- where–条件。可以使用许多不同的格式来提供 条件。见docs。
- inner_join,left_join-要与其联接的表的列表 连接条件。也可以是类列表(如果合适) 已宣布成立协会。见 docs。
- order–order子句
- limit–LIMIT子句
- group–分组子句
- scopes–预定义作用域的列表。见文件。
where参数
以下是将条件子句馈送到查询的不同方法。* where = "name = 'John'"*where = {'name': 'John'}* where = {'id': (0, 3)}–选择id介于0和3之间的位置* where = {'id': [0, 1, 2]}–选择id在数组中的位置* where = [{'id': (0, 10), 'instrument': 'drums'}, ["created_at > %(created_at)s", {'created_at': '1963-03-22'}]]
inner_join,left_join参数
连接另一个表的最简单方法如下
>>>User.select(inner_join=["instruments i ON i.id = u.instrument_id"])
如果已配置模型关联,请参见 here,您只需将类作为参数传递即可:
>>>User.select(inner_join=[Instruments])
个人记录选择
您还可以按ID查找单个记录:
>>>User.find(1)# /* My Great App */ SELECT * FROM users u WHERE u.id = 1;{'id':1,'name':'Paul','email':'paul@beatl.es',...}
注意,返回的对象是一个Record对象,它允许您 以这种方式访问属性:
>>>user['name']Paul>>>user.namePaul
插入查询
>>>user=User.insert(name='Pete',email='pete@beatl.es')# /* My Great App */ INSERT INTO users (name, email) VALUES ('Pete', 'pete@beatl.es') RETURNING id;# /* My Great App */ SELECT u.* FROM users WHERE u.id = 4;>>>useridnameemail4Petepete@beatl.es
更新查询
>>>users=User.update(values={'hair':'long'},where={'name':'John'})# /* My Great App */ UPDATE users u SET (u.hair) = ('long') WHERE u.name = 'John' RETURNING id;# /* My Great App */ SELECT * FROM users u WHERE u.name = 'John';
删除查询
>>>User.delete(where={'id':1})# /* My Great App */ DELETE FROM users u WHERE u.id = 1;
关联
可以定义模型之间的关联。例如,如果 每个用户都有多个仪器:
# app.pyimportjardinclassMyModel(jardin.Model):db_names={'read':'my_first_database','write':'my_second_database'}classInstrument(MyModel):belongs_to={'users':'user_id'}classUser(MyModel):has_many=[Instruments]
然后您可以查询关联的记录:
>>>users=User.select()# /* My Great App */ SELECT * FROM users u;>>>instruments=users.instruments()# /* My Great App */ SELECT * FROM instruments i WHERE i.id IN (0, 1, ...);
或者您可以更轻松地声明联接
>>>users=User.select(inner_join=[Instruments])
范围
查询条件可以在整个应用程序中通用化:
# app.pyclassUser(jardin.Model):scopes={'alive':{'name':['Paul','Ringo']},'guitarists':{'name':['John','George']}}
键是作用域的名称,值是 应用。任何可以输入到的where参数 Model#select可用于定义作用域。
使用它们:
>>>users=User.select(scopes=['alive'],...)# /* My Great App */ SELECT * FROM users u WHERE u.name IN ('Paul', 'Ringo') AND ...;