2019独角兽企业重金招聘Python工程师标准>>>

autoincrement

当主键是int类型是,这个属性默认是true,需要显示设置autoincrement=False关闭

flush 和 commit

session就是transaction,flush的作用是将sql发送到bd服务器,commit的作用是提交事务。flush之后在当前session中能看到效果,commit之后在其他的session中也能看到效果

merge

接受一个model对象,作用类似与MySQL的replace into, 就是有则更新无则插入。add接受相同的参数,直接插入。

update

接受一个字典,键是User.name这样的属性返回的字符串

session.update({User.id:123,User.name:'CooMark'})

execute

执行sql,返回的结果是个sqlalchemy.engine.ResultProxy对象
http://docs.sqlalchemy.org/en/rel_1_0/core/connections.html?highlight=sqlalchemy%20engine%20result%20resultproxy#sqlalchemy.engine.ResultProxy

pc = session.execute('select 123 as age')row = fetchone()col1 = row[0]    # access via integer position, 索引检索col2 = row['age']   # access via name, 用名字检索列col3 = row[mytable.c.mycol] # access via Column object.

原文: 作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼!

#作者:笑虎
#链接:https://zhuanlan.zhihu.com/p/23190728
#来源:知乎
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。# _*_ coding: utf-8 _*_import sqlalchemy
import sqlalchemy.orm
import sqlalchemy.ext.declarative# 利用数据库字符串构造engine, echo为True将打印所有的sql语句, 其他数据库的链接方式可自行百度
# engine = sqlalchemy.create_engine("mysql+pymysql://username:password@hostname/dbname", encoding="utf8", echo=True)
engine = sqlalchemy.create_engine("mysql+pymysql://dba_0:mimadba_0@101.200.174.172/data_secret", encoding="utf8", echo=False)"""
# 利用engine创建connection,因为使用了with所以不需要close操作,这部分不是重点
with engine.connect() as conn:# 最基础的用法result = conn.execute("select * from tablename limit 10;")for item in result:print(item)# execute的几种用法,这里具体还是得参考pymysql的用法,不需要执行commit操作conn.execute("insert into tablename(id, url, title) values(1, 'url1', 'title1');")conn.execute("insert into tablename(id, url, title) values(%s, %s, %s);", 2, "url2", "title2")conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", (3, "url3", "title3"))conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(31, "url31", "title31"), (32, "url32", "title32")])# 使用事务可以进行批量提交和回滚trans = conn.begin()try:conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(4, "url4", "title4"), (5, "url5", "title5")])trans.commit()except Exception as excep:trans.rollback()raisetrans.close()
"""# 首先需要生成一个BaseModel类,作为所有模型类的基类
BaseModel = sqlalchemy.ext.declarative.declarative_base()# 构建数据模型User
class User(BaseModel):__tablename__ = "Users"         # 表名__table_args__ = {"mysql_engine": "InnoDB",   # 表的引擎"mysql_charset": "utf8",    # 表的编码格式}# 表结构,具体更多的数据类型自行百度id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, autoincrement=True)name = sqlalchemy.Column("name", sqlalchemy.String(50), nullable=False)age = sqlalchemy.Column("age", sqlalchemy.Integer, default=0)# 添加角色id外键(关联到Role.id属性)role_id = sqlalchemy.Column("role_id", sqlalchemy.Integer, sqlalchemy.ForeignKey("Roles.id"))# 添加关系属性(关联到role_id外键上)role = sqlalchemy.orm.relationship("Role", foreign_keys="User.role_id")# 添加关系属性(关联到role_id外键上),如果使用了这种方式,Role模型中的users可以省略# role = sqlalchemy.orm.relationship("Role", foreign_keys="User.role_id", backref=sqlalchemy.orm.backref("users"))# 构建数据模型Role
class Role(BaseModel):__tablename__ = "Roles"         # 表名__table_args__ = {"mysql_engine": "InnoDB",   # 表的引擎"mysql_charset": "utf8",    # 表的编码格式}# 表结构,具体更多的数据类型自行百度id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True)name = sqlalchemy.Column("name", sqlalchemy.String(50), unique=True)# 添加关系属性(关联到User.role_id属性上)users = sqlalchemy.orm.relationship("User", foreign_keys="User.role_id")# 利用Session对象连接数据库
DBSessinon = sqlalchemy.orm.sessionmaker(bind=engine)   # 创建会话类
session = DBSessinon()                                  # 创建会话对象# 删除所有表
BaseModel.metadata.drop_all(engine)
# 创建所有表,如果表已经存在,则不会创建
BaseModel.metadata.create_all(engine)try:# 清空数据,不需要commit操作session.query(User).filter(User.id != -1).delete()session.query(Role).filter(Role.id != -1).delete()# 删除数据的另外一种形式:session.delete()# 插入数据,这里的一个实例只插入一次,第二次插入不生效session.add(Role(id=1, name="student"))session.add(Role(id=2, name="teacher"))session.commit()session.add(User(name="James", age=20, role_id=1))session.add(User(name="Wade", age=40, role_id=2))session.commit()user = User(name="Kobe", age=24, role_id=1)session.add(user)session.commit()# 修改数据user.name = "Allen"session.merge(user)                         # 使用merge方法,如果存在则修改,如果不存在则插入session.query(User).filter(User.id == user.id).update({User.name: "Allen"})         # 使用update方法session.query(User).filter(User.id == user.id).update({User.age: User.age + 1})     # 使用update方法,自增操作# 查询数据roles = session.query(Role)                 # 返回全部结果for role in roles:print("Role:", role.id, role.name)users = session.query(User)                 # 返回全部结果for user in users:print("User:", user.id, user.name, user.age, user.role_id)# 其他获取数据的方式print("get(id):", session.query(User).get(1))                       # 返回结果集中id为1的项print("get[1:3]:", session.query(User)[1:3])                        # 返回结果集中的第2-3项# 其他高级查询,这里以Users表为例users = session.query(User).filter(User.id > 6)                     # 条件查询users = session.query(User).filter(User.id > 6).all()               # 条件查询,返回查询的全部数据user = session.query(User).filter(User.id > 6).first()              # 条件查询,返回查询数据的第一项users = session.query(User).filter(User.id > 6).limit(10)           # 条件查询,返回最多10条数据users = session.query(User).filter(User.id > 6).offset(2)           # 条件查询,从第3条数据开始返回users = session.query(User).filter(User.id > 6, User.name == "Kobe")                    # 条件查询,and操作users = session.query(User).filter(User.id > 6).filter(User.name == "Kobe")             # 条件查询,and操作users = session.query(User).filter(sqlalchemy.or_(User.id > 6, User.name == "Kobe"))    # 条件查询,or操作users = session.query(User).filter(User.id.in_((1, 2)))                                 # 条件查询,in操作users = session.query(User).filter(sqlalchemy.not_(User.name))                          # 条件查询,not操作user_count = session.query(User.id).count()                                             # 统计全部user的数量user_count = session.query(sqlalchemy.func.count(User.id)).scalar()                     # scalar操作返回第一行数据的第一个字段session.query(sqlalchemy.func.count("*")).select_from(User).scalar()                    # scalar操作返回第一行数据的第一个字段session.query(sqlalchemy.func.count(1)).select_from(User).scalar()                      # scalar操作返回第一行数据的第一个字段session.query(sqlalchemy.func.count(User.id)).filter(User.id > 0).scalar()              # filter() 中包含 User,因此不需要指定表session.query(sqlalchemy.func.sum(User.age)).scalar()                                   # 求和运算,运用scalar函数session.query(sqlalchemy.func.avg(User.age)).scalar()                                   # 求均值运算,运用scalar函数session.query(sqlalchemy.func.md5(User.name)).filter(User.id == 1).scalar()             # 运用md5函数users = session.query(sqlalchemy.distinct(User.name))               # 去重查询,根据name进行去重users = session.query(User).order_by(User.name)                     # 排序查询,正序查询users = session.query(User).order_by(User.name.desc())              # 排序查询,倒序查询users = session.query(User).order_by(sqlalchemy.desc(User.name))    # 排序查询,倒序查询的另外一种形式users = session.query(User.id, User.name)                           # 只查询部分属性users = session.query(User.name.label("user_name"))                 # 结果集的列取别名for user in users:print("label test:", user.user_name)                            # 这里使用别名users = session.query(sqlalchemy.func.count(User.name).label("count"), User.age).group_by(User.age)    # 分组查询for user in users:print("age:{0}, count:{1}".format(user.age, user.count))# 多表查询result = session.query(User, Role).filter(User.role_id == Role.id)for user, role in result:print("user %s's role is %s" % (user.name, role.name))users = session.query(User).join(Role, User.role_id == Role.id)for user in users:print("user join, name:", user.name)# 关联属性的用法roles = session.query(Role)for role in roles:print("role:%s users:" % role.name)for user in role.users:print("\t%s" % user.name)users = session.query(User)for user in users:print("user %s's role is %s" % (user.name, user.role.name))except Exception as excep:session.rollback()raisesession.close()

转载于:https://my.oschina.net/lemonwater/blog/1549242

sqlalchemy学习相关推荐

  1. sqlalchemy学习笔记

    SQLAlchemy是python的一个数据库ORM工具,提供了强大的对象模型间的转换,可以满足绝大多数数据库操作的需求,并且支持多种数据库引擎(sqlite,mysql,postgres, mong ...

  2. sqlalchemy 学习笔记(全)

    https://segmentfault.com/a/1190000006949536 SQLAlchemy是python的一个数据库ORM工具,提供了强大的对象模型间的转换,可以满足绝大多数数据库操 ...

  3. ORM框架SQLAlchemy学习笔记

    ORM框架SQLAlchemy 一 介绍 二 创建表 三 增删改查 四 其他查询相关 五 正查.反查 一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之 ...

  4. Python之SQLAlchemy学习

    alchemy 英[ˈælkəmi] 美[ˈælkəmi] n. 炼金术; 炼丹术; (改变事物.物质的)魔力(或方法) ; (事物.物质的) 神秘变化; SQLAlchemy是Python中最有名的 ...

  5. SQLAlchemy学习教程

    简介 简单来说就是讲类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果! 最容易入门的情况,如果有一张用户表,这个表里面是记录的所有用户的信息,包含名字.年龄.性别.这是数据表的基本情况 ...

  6. 学习 python ORM 类库 SQLAlchemy 使用

    具体ORM的详细说明可以看 这里http://baike.baidu.com/view/197951.htm ORM方法论基于三个核心原则: 简单:以最基本的形式建模数据. 传达性:数据库结构被任何人 ...

  7. python mysql工具类_Python工具类(一)—— 操作Mysql数据库

    如何调用直接看__main__函数里如何调用此工具类就阔以啦! # encoding=utf-8 import pymysql # 导入所有Mysql配置常量,请自行指定文件 from conf.se ...

  8. SqlAlchemy个人学习笔记完整汇总

    使用 sqlalchemy 有3种方式: 方式1, 使用raw sql; 方式2, 使用SqlAlchemy的sql expression; 方式3, 使用ORM.   前两种方式可以统称为 core ...

  9. 转载--SqlAlchemy ORM 学习

    转载原文地址:http://blog.csdn.net/yueguanghaidao/article/details/7485345,http://blog.csdn.net/yueguanghaid ...

最新文章

  1. php 1到9加,php通过排列组合实现1到9数字相加都等于20的方法
  2. std::string的find问题研究
  3. 第八周项目5-定期存款利息计算器
  4. scala模式匹配match操作
  5. linux 创建连接命令 ln -s 软连接
  6. 毕业设计《MMORPG DEMO》——1
  7. TP框架中同时使用“or”和“and”
  8. 修改了一下voddown.py
  9. 机器学习-分类之支持向量机(SVM)原理及实战
  10. Android 系统性能优化(30)---Android性能全面分析与优化方案研究
  11. 局域网服务器传输大文件方案,局域网快速传输大文件【操作方案】
  12. 枚举算法(百钱百鸡问题 C语言)
  13. 在OpenCV + Python中使用色彩空间进行图像分割
  14. 微信小程序echarts问题整理与解决
  15. android pm 列出权限,Android pm命令
  16. 路由器 RIP-2 配置
  17. Python学习笔记三之编程练习:循环、迭代器与函数
  18. ubuntu20.04基础入门日记V1.0
  19. 听完阿里“计算”家族技术领头人的分享,真的受益匪浅!
  20. c语言while根据近似公式求,c语言用π=1-1/3+1/5-1/7+.公式求π的近似值,直到最后一项的绝对值小于10^-6为止...

热门文章

  1. 在Ubuntu 16.04上增加Swap分区
  2. Linux安全配置规范
  3. PowerShell 中执行 dir /b /s
  4. 「S-A-L-T-A」项目失败总结!
  5. plpgsql语句的兼容性
  6. 【Oracle】设置快速恢复区及reset快速恢复区
  7. zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  8. Hibernate 异常:“@OneToOne or @ManyToOne on XXX references an unknown entity: XXX”
  9. Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证
  10. TypeError: ‘builtin_function_or_method‘ object is not subscriptable 报错解决方法