sqlalchemy的两种方法详解

本文详细介绍SQLAlchemy的ORM和Core两种使用方式,通过实例演示如何进行数据库操作,包括单表和多表查询、插入、更新及删除等功能,是Python数据库操作的实用指南。
部署运行你感兴趣的模型镜像

工作需要,用到了sqlalchemy, 经过近一个月的不断学习和探索实践,现在整理一下,以免将来没地方找。

sqlalchemy有两种方法,一种是session-mapper的方式,称为orm方式,另一种就是原生的select等sql语句,称之为core方式。

下面的讲解我们统一把数据库的相关操作封装在一个类里面。

先来说第一种:

  1. from sqlalchemy import create_engine

  2. from sqlalchemy.ext.declarative import declarative_base

  3. from sqlalchemy.dialects.mysql import INTEGER, DATETIME, REAL, TEXT, VARCHAR

  4. from sqlalchemy import Table, Column, ForeignKey, MetaData

  5. from sqlalchemy.orm import mapper, sessionmaker

  6. from sqlalchemy import func

  7. import re

  8. import hashlib

  9. import os, sys

  10. import time, datetime

  11.  
  12.  
  13. class SelectData():

  14. def __init__(self):

  15. s1 = "mysql+mysqldb://"

  16. server = "root:123456@localhost:3306/test"

  17. s2 = "?use_unicode=0&charset=utf8"

  18. connectserver = s1 + server + s2

  19. self.engine = create_engine(connectserver, encoding = 'utf-8', echo = False)

  20. self.Base = MetaData()

  21.  
  22. self.user= Table(

  23. 'user', self.Base,

  24. Column('id', INTEGER, primary_key = True),

  25. Column('name', TEXT)

  26. Column('passwd', TEXT)

  27. )

  28. self.client = Table(

  29. 'client', self.Base,

  30. Column('id', INTEGER, primary_key = True),

  31. Column('name', TEXT),

  32. Column('id_user', INTEGER),

  33. Column('reserved_int', INTEGER),

  34. Column('reserved_varchar', VARCHAR(200))

  35. )

  36. self.Base.create_all(self.engine)#create_all可以自动检测表是否已经建立,非常方便

  37. self.Session = sessionmaker() #创建了一个自定义了的 Session类

  38. self.Session.configure(bind = self.engine) #将创建的数据库连接关联到这个session

下面的函数是单表的查询插入更新展示:

  1. def insert_function(self):

  2. session = self.Session()

  3. class User(object): pass

  4. mapper(User, self.user)

  5. class Client(object): pass

  6. mapper(Client, self.client)

  7.  
  8. #select方式:

  9. ret = session.query(User).filter(User.name == "admin").first()

  10. if ret is None:

  11. #添加新的字段

  12. user = User()

  13. user.name = "admin"

  14. user.passwd = CountMd5("123456")#此处CountMd5()是自己写的一个计算md5值的函数

  15. session.add(user)

  16. session.flush()

  17. #session.commit()

  18. #获取刚刚插入数据的自增主键id

  19. id_usr = user.id

  20. else:

  21. id_usr = ret.id

  22.  
  23. ret2 = session.query(Client).filter_by(id_user = id_usr).first()

  24. if ret2 is None:

  25. client = Client()

  26. client.name = "Chocolate"

  27. client.id_user = id_usr

  28. client.session.add(client)

  29. session.flush()

  30. session.commit()

  31. else:

  32. #使用update:

  33. session.query(Client).filter_by(id_user = id_usr).update({"name": "Chocolate", "id_user":id_usr})

  34. session.flush()

  35. session.commit()

  36. session.close()

下面是多表联合查询:

  1. #多表联合查询

  2. def testfun2(self, partname, pageindex):

  3. session = self.Session()

  4. class User(object): pass

  5. mapper(User, self.user)

  6. class Client(object): pass

  7. mapper(Client, self.client)

  8.  
  9. pageval = (pageindex - 1) * 10

  10. #这里面一个是like的用法,一个是只显示某10条

  11. ret = self.session.query(User)\

  12. .join(Client, Client.id_user == User.id )\

  13. .filter(User.name.like('%' + partname + '%'))\

  14. .offset().limit(10).all()

  15. if ret is None:

  16. return None

  17. else:

  18. for k in ret:

  19. print k.name, k.passwd

  20. session.close()

下面是删除表的内容的用法:

 

  1. #删除表的全部内容,不删除表

  2. def delete_func(self):

  3. session = self.Session()

  4. class User(object): pass

  5. mapper(User, self.user)

  6. class Client(object): pass

  7. mapper(Client, self.client)

  8. session.query(Client).delete()

  9. session.query(User).delete()

  10. session.commit()

  11. session.close()

上面就是orm的方式了,这个方式要特别注意的地方就是,session的问题,因为session是有个有效期的,如果我们把session在init函数里面做成全局变量self.session,那么就会出现数据库实时更新插入的值这里面查询不到,所以,对于session的态度,我们是用到再新建,用完手动关闭。

 

然后下面我们来讲一下第二种方式,core的方式:

上面建表的部分是一样的,只不过要把建完表之后session那一块替换为:

 

  1. self.Base.create_all(self.engine)

  2. self.conn = self.engine.connect()

 

定义一个关闭数据库连接的函数:

 

  1. def close(self):

  2. self.conn.close()

 

下面是简单的一些基本用法:

包含了查询,插入和更新。

 

  1. def resetpwd(self, passwdm):

  2. sel = select([self.user]).where(self.user.c.name == "admin")

  3. ret = self.conn.execute(sel).fetchone()

  4. if ret is None:

  5. ins = self.user.insert().values(name = "admin", passwd = passwdm)

  6. self.conn.execute(ins)

  7. else:

  8. updpwd = self.user.update().values(name = "admin", passwd = passwdm).where(self.user.c.name == "admin")

  9. self.conn.execute(updpwd)


execute会自动commit,不用我们去手动做。这种core的方式要注意的地方就是表后面有个.c,如self.user.c.name,我也不知道为什么有这个c,看官网的用例上都是这样的,如果不加的话就不正确。所以还是屈从权威吧。问题解决了才最重要。

 

 

--------------------- 本文来自 Daisy_Echo 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/ichocolatekapa/article/details/23946263?utm_source=copy 

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 关于 SQLAlchemy 中 `sql.func` 的用法和文档 在 SQLAlchemy 中,`sqlalchemy.sql.expression.func` 是用于生成 SQL 函数调用的一个工具。它允许开发者通过 Python 对象的方式构建数据库函数表达式[^5]。 #### 基本概念 `func` 提供了一种动态方式来创建 SQL 函数调用。例如,在查询中可以使用 `func.count()` 来实现计数操作或者使用 `func.now()` 获取当前时间戳。这些方法会自动转换成相应的 SQL 表达式并发送到数据库执行。 #### 使用示例 以下是几个常见的例子展示如何利用 `func`: ```python from sqlalchemy import func, select from mymodels import User # Assume this is your model class defined elsewhere. # Example of counting all users. count_query = select([func.count(User.id)]).select_from(User) # Getting current timestamp using database's NOW function. current_time_query = select([func.now()]) # Summing up values in a specific column named 'salary'. sum_salary_query = select([func.sum(User.salary)]) ``` 上述代码片段展示了三种不同类型的 SQL 功能应用:统计记录数量、获取服务器端的时间以及计算数值列总和[^6]。 #### 文档资源推荐 对于更深入的学习,官方教程是最权威的信息源之一。虽然提到的核心(Core) 和对象关系映射(ORM) 教程涵盖了大部分基础知识点[^2] ,但对于特定功能如 `func` 的细节描述可能需要查阅 API 参考手册部分。此外还可以参考一些社区贡献的文章或书籍进一步巩固理解[^7]。 #### 注意事项 当组合多个条件时可借助逻辑运算符辅助完成复杂筛选需求[^3] 。不过需要注意的是并非所有的数据库都支持同样的内置函数集合因此实际开发过程中要考虑到目标DBMS的具体特性限制情况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值