基于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_joinleft_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_joinleft_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 ...;

其他

水印和跟踪

多个数据库

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中的开源字典组件   即使在成功执行删除查询之后,java更新的列表也不会显示在jsp页面中   java Apache:无法启动上下文路径/网站上的失败应用程序   java验证CSV中的特定列   对于具有专用内存的java应用程序,最小堆大小低于最大堆大小有意义吗?   java将数组中的值转换为多维数组   java在给定程序中,垃圾收集器在对象被取消引用之前正在运行。。。使用jre 7(32位)   java在运行时动态刷新文件夹   eclipse如何解决“java.net.BindException:地址已在使用:JVM_Bind”错误?   Java数组与数组   每次任务完成任务时,Java多线程都会安排任务   java部分编译时使用maven编织第三方jar   java Dokku单一回购中的多个应用程序   用apachevelocity生成javac/C++语言文件   java如何使用spring应用程序上下文中的属性文件实例化列表   java访问智能卡文件结构   具有GlobalMethodSecurity的java自定义UserDetailService循环引用   java如何集成Spring和JSF