sqlalchemy官网API参考

autoincrement

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

flush 和 commit

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

merge

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

user.name = "Mark"
session.merge(user) # 使用merge方法,如果存在则修改,如果不存在则插入

update

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

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

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方法,自增操作

execute

执行sql,返回的结果是个sqlalchemy.engine.ResultProxy对象

http://docs.sqlalchemy.org/en/rel_1_0/core/connections.html?highlight=sqlalchemy engine result resultproxy#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()
raise
trans.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()
raise session.close()

sqlalchemy学习的更多相关文章

  1. SQLAlchemy 学习笔记(二):ORM

    照例先看层次图 一.声明映射关系 使用 ORM 时,我们首先需要定义要操作的表(通过 Table),然后再定义该表对应的 Python class,并声明两者之间的映射关系(通过 Mapper). 方 ...

  2. sqlAlchemy学习 001

    研究学习主题 sqlAlchemy架构图 测试练习代码编写 连接数据库 看代码 db_config = { 'host': 'xxx.xxx.xxx.xx', 'user': 'root', 'pas ...

  3. SQLAlchemy 学习笔记(一):Engine 与 SQL 表达式语言

    个人笔记,如有错误烦请指正. SQLAlchemy 是一个用 Python 实现的 ORM (Object Relational Mapping)框架,它由多个组件构成,这些组件可以单独使用,也能独立 ...

  4. Python之SQLAlchemy学习

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

  5. sqlalchemy学习-- 重要参数

    Base = declarative_base 基类: 1.存储表 2.建立class-Table 的映射关系 engine = create_engine('mysql://root:root@lo ...

  6. sqlalchemy 学习--单表操作

    以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ...

  7. Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...

  8. sqlalchemy 学习(二)scoped session

    数据库设计的难点之一,是session生命周期的管理问题.sqlalchemy提供了一个简单的session管理机制,即scoped session.它采用的注册模式.所谓的注册模式,简单来说,是指在 ...

  9. SQLAlchemy 学习笔记(三):ORM 中的关系构建

    个人笔记,不保证正确. 关系构建:ForeignKey 与 relationship 关系构建的重点,在于搞清楚这两个函数的用法.ForeignKey 的用法已经在 SQL表达式语言 - 表定义中的约 ...

随机推荐

  1. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  2. 基于OpenCV的车辆检测与追踪的实现

    最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...

  3. XSS分析及预防

    XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.在WEB前端应用日益发展的今天,XSS漏洞尤其容易被开发人员忽视,最终可能造成对个人信息 ...

  4. JS继承类相关试题

    题目一: //有关于原型继承的代码如下:function Person(name) {   this.name = name;}Person.prototype = {     getName : f ...

  5. 玩转Vim 编辑器

    一:VIM快速入门 1.vim模式介绍 以下介绍内容来自维基百科Vim 从vi演生出来的Vim具有多种模式,这种独特的设计容易使初学者产生混淆.几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数 ...

  6. Lind.DDD.LindAspects方法拦截的介绍

    回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...

  7. Android—自定义开关按钮实现

    我们在应用中经常看到一些选择开关状态的配置文件,做项目的时候用的是android的Switch控件,但是感觉好丑的样子………… 个人认为还是自定义的比较好,先上个效果图:

  8. HTML5 标签 details 展开 搜索

    details有一个新增加的子标签--summary,当鼠标点击summary标签中的内容文字时,details标签中的其他所有元素将会展开或收缩. 默认状态为 收缩状态 设置为展开状态为 <d ...

  9. Windows cmd 长时间不输出新内容 直到按下ctrl + c 取消或者回车的解决办法

    换了一台新电脑, 在使用 ant 拷贝大量文件的时候 cmd 窗口过了很久没有继续输出新的内容,远远超过平时的耗时, 以为已经卡死 按下 ctrl + c 取消, 这时并没有取消, 而是输出了新内容, ...

  10. [django]数据导出excel升级强化版(很强大!)

    不多说了,原理采用xlwt导出excel文件,所谓的强化版指的是实现在网页上选择一定条件导出对应的数据 之前我的博文出过这类文章,但只是实现导出数据,这次左思右想,再加上网上的搜索,终于找出方法实现条 ...