基于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 Recyclerview?   返回空值的java MapPartitionFunction   java无法访问apache模块源代码中的系统定义的环境变量   java需要帮助确定用户输入的最大值和最小值   java检查文件是否存在,如果存在,则创建一个编号更高的新文件   针对许多不正确XML文档的XSD的XML验证在Java中不报告任何错误?   java有没有一种方法可以将json字符串甚至JSONObject发送给POSTMAN,而不在每个双引号前加斜杠?   java如何获得频域中两个音频信号的比率?   java 安卓 studio理解错误   java插入到部分填充的数组中   java使用流<String>创建流<CustomType>?   java开放式按键应用程序   java获取zxing生成的图像路径   使用shibboleth sso的java授权   java在运行时更改bean类名   javajooq如何从表中选择min'id'   java通过Eclipse web项目运行hadoop mapreduce字数   java同步方法与非同步方法同时执行   方法每次返回一个不同的加密字符数组   java获取ArrayList的每个元素中出现的特定字符的频率<String>