python(sqlalchemy基本使用)

文章目录

[隐藏]

  • 查询
  • 修改
  • 回滚
  • 获取所有数据
  • 多条件查询
  • 统计和分组
  • 常用查询语法

下面就开始让你见证orm的nb之处,盘古开天劈地之前,我们创建一个表是这样的

CREATE TABLE user (      id INTEGER NOT NULL AUTO_INCREMENT,      name VARCHAR(32),      password VARCHAR(64),      PRIMARY KEY (id)  )  

这只是最简单的sql表,如果再加上外键关联什么的,一般程序员的脑容量是记不住那些sql语句的,于是有了orm,实现上面同样的功能,代码如下

import sqlalchemy  from sqlalchemy import create_engine  from sqlalchemy.ext.declarative import declarative_base  from sqlalchemy import Column, Integer, String  engine = create_engine("mysql+pymysql://root:[email protected]/testdb",                                      encoding='utf-8', echo=True)  Base = declarative_base() #生成orm基类  class User(Base):      __tablename__ = 'user' #表名      id = Column(Integer, primary_key=True)      name = Column(String(32))      password = Column(String(64))  Base.metadata.create_all(engine) #创建表结构  

你说,娘那个腚的,并没有感觉代码量变少啊,呵呵, 孩子莫猴急,好戏在后面

Lazy Connecting  The Engine, when first returned by create_engine(), has not actually tried to connect to the database yet; that happens only the first time it is asked to perform a task against the database.  

除上面的创建之外,还有一种创建表的方式,虽不常用,但还是看看吧

http://www.cnblogs.com/alex3714/articles/5978329.html#

事实上,我们用第一种方式创建的表就是基于第2种方式的再封装。

最基本的表我们创建好了,那我们开始用orm创建一条数据试试

Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例  Session = Session_class() #生成session实例  user_obj = User(name="alex",password="alex3714") #生成你要创建的数据对象  print(user_obj.name,user_obj.id)  #此时还没创建对象呢,不信你打印一下id发现还是None  Session.add(user_obj) #把要创建的数据对象添加到这个session里, 一会统一创建  print(user_obj.name,user_obj.id) #此时也依然还没创建  Session.commit() #现此才统一提交,创建数据  

我擦,写这么多代码才创建一条数据,你表示太tm的费劲了,正要转身离开,我拉住你的手不放开,高潮还没到。。

查询
my_user = Session.query(User).filter_by(name="alex").first()  print(my_user)  

此时你看到的输出是这样的应该

<__main__.User object at 0x105b4ba90>  

我擦,这是什么?这就是你要的数据呀, 只不过sqlalchemy帮你把返回的数据映射成一个对象啦,这样你调用每个字段就可以跟调用对象属性一样啦,like this..

print(my_user.id,my_user.name,my_user.password)  输出  1 alex alex3714  

不过刚才上面的显示的内存对象对址你是没办法分清返回的是什么数据的,除非打印具体字段看一下,如果想让它变的可读,只需在定义表的类下面加上这样的代码

def __repr__(self):      return "<User(name='%s',  password='%s')>" % (          self.name, self.password)  
修改
my_user = Session.query(User).filter_by(name="alex").first()  my_user.name = "Alex Li"  Session.commit()  
回滚
my_user = Session.query(User).filter_by(Jack"  fake_user = User(name='Rain', password='12345')  Session.add(fake_user)  print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() )  #这时看session里有你刚添加和修改的数据  Session.rollback() #此时你rollback一下  print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #再查就发现刚才添加的数据没有了。  # Session  # Session.commit()  
获取所有数据
print(Session.query(User.name,User.id).all() )  
多条件查询
objs = Session.query(User).filter(User.id>0).filter(User.id<7).all()  

上面2个filter的关系相当于 user.id >1 AND user.id <7 的效果

统计和分组
Session.query(User).filter(User.name.like("Ra%")).count()  

分组

from sqlalchemy import func  print(Session.query(func.count(User.name),User.name).group_by(User.name).all() )  

相当于原生sql为

http://www.cnblogs.com/alex3714/articles/5978329.html#

输出为

[(1, ‘Jack’), (2, ‘Rain’)]  

外键关联

我们创建一个addresses表,跟user表关联

from sqlalchemy import ForeignKey  from sqlalchemy.orm import relationship  class Address(Base):      __tablename__ = 'addresses'      id = Column(Integer, primary_key=True)      email_address = Column(String(32), nullable=False)      user_id = Column(Integer, ForeignKey('user.id'))      user = relationship("User", backref="addresses") #这个nb,允许你在user表里通过backref字段反向查出所有它在addresses表里的关联项      def __repr__(self):          return "<Address(email_address='%s')>" % self.email_address  
The relationship.back_populates parameter is a newer version of a very common SQLAlchemy feature calledrelationship.backref. The relationship.backref parameter hasn’t gone anywhere and will always remain available! The relationship.back_populates is the same thing, except a little more verbose and easier to manipulate. For an overview of the entire topic, see the section Linking Relationships with Backref.  

表创建好后,我们可以这样反查试试

obj = Session.query(User).first()  for i in obj.addresses: #通过user对象反查关联的addresses记录      print(i)  addr_obj = Session.query(Address).first()  print(addr_obj.user.name)  #在addr_obj里直接查关联的user表  

创建关联对象

obj = Session.query(User).filter(User.name=='rain').all()[0]  print(obj.addresses)  obj.addresses = [Address(email_address="[email protected]"), #添加关联对象                   Address(email_address="[email protected]")]  Session.commit()  
常用查询语法

Common Filter Operators

Here’s a rundown of some of the most common operators used in filter():

  • equals:
     query.filter(User.name == 'ed')  
  • not equals:
     query.filter(User.name != 'ed')  
  • LIKE:

query.filter(User.name.like(‘%ed%’))

  • IN:
  • NOT IN:
    query.filter(~User.name.in_([‘ed’, ‘wendy’, ‘jack’]))
  • IS NULL:
  • IS NOT NULL:
  • AND:
    2.1. ObjectRelationalTutorial 17
query.filter(User.name.in_(['ed', 'wendy', 'jack']))  
# works with query objects too:  

query.filter(User.name.in_( session.query(User.name).filter(User.name.like(‘%ed%’))

))

query.filter(User.name == None)  
# alternatively, if pep8/linters are a concern  
query.filter(User.name.is_(None))  
query.filter(User.name != None)  
# alternatively, if pep8/linters are a concern  
query.filter(User.name.isnot(None))  

SQLAlchemy Documentation, Release 1.1.0b1
# use and_()
from sqlalchemy import and_
query.filter(and_(User.name == ‘ed’, User.fullname == ‘Ed Jones’))

# or send multiple expressions to .filter()  
query.filter(User.name == 'ed', User.fullname == 'Ed Jones')  
# or chain multiple filter()/filter_by() calls  
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')  

Note: Makesureyouuseand_()andnotthePythonandoperator! • OR:

Note: Makesureyouuseor_()andnotthePythonoroperator! • MATCH:

query.filter(User.name.match(‘wendy’))
Note: match() uses a database-specific MATCH or CONTAINS f

原文:http://www.cnblogs.com/alex3714/articles/5978329.html  

原文出处:sooele -> https://www.sooele.com/index.php/2018/05/07/pythonsqlalchemy%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。