sqlalchemy基本的增删改查
#encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker HOSTNAME = '127.0.0.1' PORT = 3306 DATABASE = 'first_sqlalchemy' USERNAME = 'root' PASSWORD = '' #dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/" \
"{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE) engine = create_engine(DB_URI) Base = declarative_base(engine)
# Session = sessionmaker(engine)
# session = Session() session = sessionmaker(engine)()#这里要解释下,学习python都是类里面的流程是__new__,类实例化一个空对象,__init__,为空对象构造属性,__call__,把对象变成一个函数调用
class sessionmaker(_SessionClassMethods):
def __init__(self, bind=None, class_=Session, autoflush=True,
autocommit=False,
expire_on_commit=True,
info=None, **kw):
#这一步就是sessionmaker(engine)干的事,实例化一个对象,后面加个括号是干嘛呢?,就是对象调用加括号调用了__call__方法。
def __call__(self, **local_kw):
"""Produce a new :class:`.Session` object using the configuration
established in this :class:`.sessionmaker`. In Python, the ``__call__`` method is invoked on an object when
it is "called" in the same way as a function:: Session = sessionmaker()
session = Session() # invokes sessionmaker.__call__() """
for k, v in self.kw.items():
if k == 'info' and 'info' in local_kw:
d = v.copy()
d.update(local_kw['info'])
local_kw['info'] = d
else:
local_kw.setdefault(k, v)
return self.class_(**local_kw) #返回了 self.class_(**local_kw) , self.class_ = Session(**local_kw)
#
Session = sessionmaker(engine)() #其实就是 session = Session(**local_kw) 就是Session的对象
python前面,面向对象
class DistanceForm(object):
def __init__(self, origin):
self.origin = origin
print "origin :"+str(origin)
def __call__(self, x):
print "x :"+str(x)
p = DistanceForm(100)
p(2000) 输出: origin :100
x :2000 ---------------------
#创建出来一个类关系映射到数据库
class Person(Base):
__tablename__ = 'person'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(50))
age = Column(Integer)
country = Column(String(50)) def __str__(self):
return "<Person(name:%s,age:%s,country:%s)>" % (self.name,self.age,self.country)
Base.metadata.create_all() #把类的数据类型映射到数据库
#这里的__str__要不要解释呢,还是解释下吧!
class Person:
def __init__(self,name):
self.name = name
def __str__(self):
return self.name
#这个__repr__是用来干嘛的
def __repr__(self):
return '每天都有好心情'
p = Person('xiaowu')
print(p) #当打印对象p时,
# 会默认调用__str__,如果类中没有,就会打印对象的内存地址
#Python中这个_repr_函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串:
'''
尝试生成这样一个字符串,将其传给 eval()可重新生成同样的对象 ;
否则,生成用尖括号包住的字符串,包含类型名和额外的信息(比如地址) ;
一个类(class)可以通过 __repr__() 成员来控制repr()函数作用在其实例上时的行为。
'''
print(repr(p))
#来看下eval()的用法
#eval() 函数用来执行一个字符串表达式,并返回表达式的值。
#eval(expression[, globals[, locals]])
'''
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
'''
#案例:
'''
>>>x = 7
>>> eval( '3 * x' )
21
>>> eval('pow(2,2)')
4
>>> eval('2 + 2')
4
>>> n=81
>>> eval("n + 4")
85
'''
#案例演示:
class Person:
def __init__(self,name):
self.name = name
def __str__(self):
return self.name
#这个__repr__是用来干嘛的
def __repr__(self):
return "{}".format({"name":"xiaowu"})
p1 = Person('xiaohong')
P = repr(p1)
print(P)
print(eval(P))
增加:
def add_data():
p1 = Person(name='zhiliao1',age=19,country='china')
p2 = Person(name='zhiliao2',age=20,country='china')
session.add_all([p1,p2])
session.commit()
查:
# 查
def search_data():
#获取所有的对象,query类型
# all_person = session.query(Person).all()
# for p in all_person:
# print(p)
# print(p.name)
# all_person = session.query(Person).filter_by(name='zhiliao').all()
# for x in all_person:
# print(x)
# all_person = session.query(Person).filter(Person.name=='zhiliao').all()
# print(all_person) # [<__main__.Person object at 0x0000015BCE1B4630>]
# for x in all_person:
# print(x)
person = session.query(Person).first()
print(person)
改:
# 改
def update_data():
person = session.query(Person).first()
person.name = 'ketang'
session.commit()
删:
# 删
def delete_data():
person = session.query(Person).first()
session.delete(person)
session.commit()
### 用session做数据的增删改查操作:
1. 构建session对象:所有和数据库的ORM操作都必须通过一个叫做`session`的会话对象来实现,通过以下代码来获取会话对象:
```python
from sqlalchemy.orm import sessionmaker
engine = create_engine(DB_URI)
session = sessionmaker(engine)()
```
2. 添加对象:
* 创建对象,也即创建一条数据:
```python
p = Person(name='zhiliao',age=18,country='china')
```
* 将这个对象添加到`session`会话对象中:
```python
session.add(p)
```
* 将session中的对象做commit操作(提交):
```python
session.commit()
```
* 一次性添加多条数据:
```python
p1 = Person(name='zhiliao1',age=19,country='china')
p2 = Person(name='zhiliao2',age=20,country='china')
session.add_all([p1,p2])
session.commit()
```
3. 查找对象:
```python
# 查找某个模型对应的那个表中所有的数据:
all_person = session.query(Person).all()
# 使用filter_by来做条件查询
all_person = session.query(Person).filter_by(name='zhiliao').all()
# 使用filter来做条件查询
all_person = session.query(Person).filter(Person.name=='zhiliao').all()
# 使用get方法查找数据,get方法是根据id来查找的,只会返回一条数据或者None
person = session.query(Person).get(primary_key)
# 使用first方法获取结果集中的第一条数据
person = session.query(Person).first()
```
4. 修改对象:首先从数据库中查找对象,然后将这条数据修改为你想要的数据,最后做commit操作就可以修改数据了。
```python
person = session.query(Person).first()
person.name = 'ketang'
session.commit()
```
5. 删除对象:将需要删除的数据从数据库中查找出来,然后使用`session.delete`方法将这条数据从session中删除,最后做commit操作就可以了。
```python
person = session.query(Person).first()
session.delete(person)
session.commit()
sqlalchemy基本的增删改查的更多相关文章
- SQLAlchemy的使用---增删改查
#通过SQLAlchemy对数据库进行增删改查 # 想要操作数据库 先要打开数据库连接 from create_table import engine # 创建会话 - 打开数据库连接 from sq ...
- sqlalchemy 单表增删改查
1.连接数据库,并创建session from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine engi ...
- SQLAlchemy表操作和增删改查
一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...
- SQLAlchemy 增删改查 一对多 多对多
1.创建数据表 # ORM中的数据表是什么呢? # Object Relation Mapping # Object - Table 通过 Object 去操纵数据表 # 从而引出了我们的第一步创建数 ...
- SQLAlchemyの增删改查
用a*my写原味sql from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, I ...
- 13,SQLAlchemy 增删改查 一对多 多对多
今天来聊一聊 Python 的 ORM 框架 SQLAlchemy Models 是配置和使用比较简单,因为他是Django自带的ORM框架,也正是因为是Django原生的,所以兼容性远远不如SQLA ...
- SQLAlchemy 增删改查 一对一 多对多
首先要导入SQLAIchemy模块 from sqlalchemy.ect.declaative import declarative_base 创建orm基类 Base = declarative_ ...
- SQLAlchemy的增删改查 一对多 多对多
Models只是配置和使用比较简单,因为是Django自带的ORM框架,所以兼容性不行,所以出现了SQLAlchemy,SQLAlchemy是比较全面的ORM框架,它可以在任何使用SQL查询时使用 以 ...
- SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...
随机推荐
- Codeforces 839E Mother of Dragons
题 OvO http://codeforces.com/contest/839/problem/E (Codeforces Round #428 (Div. 2) - E) 解 首先,k肯定是要平均分 ...
- web上传整个文件夹
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- Spring Batch 4.2 新特性
Spring Batch 4.2 的发行版主要增强了下面的改进: 使用 Micrometer 来支持批量指标(batch metrics) 支持从 Apache Kafka topics 读取/写入( ...
- 『HGOI 20190917』Lefkaritika 题解 (DP)
题目概述 一个$n \times m$的整点集.其中$q$个点被m被设置为不能访问. 问这个点集中含有多少个不同的正方形,满足不包含任何一个不能访问的点. 对于$50\%$的数据满足$1 \leq n ...
- noi.ac #529 神树的矩阵
题目链接:戳我 当 \(max(n, m) \ge 3\) 时,可以如下构造: 考虑下面这样三个矩阵,红 + 蓝 − 绿得到的矩阵是一个第一行和最后一行全是 1,其他地方全是 0 的矩阵. 那么如果需 ...
- BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树
题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...
- luoguP5024 保卫王国
题目链接 问题分析 其实是比较明显的动态DP. 懒于再推一遍式子,直接用 最小权点覆盖=全集-最大权独立集,然后就和这道题一样了.题解可以看这里. 然后必须选或者不选的话,就直接把相应的点权变成\(- ...
- Git命令的简单整理大全
创建目录和查看路径 mkdir 创建目录 cd 进入到目录里面pwd 用于显示当前的目录cat 查看文件内容 Git命令使用说明 初始化一个目录成git的仓库(版本库)包括暂存区和ma ...
- LeetCode---Bit Manipulation && Design
**401. Binary Watch 思路:产生两个list分别代表小时和分钟,然后遍历 public List<String> readBinaryWatch(int num) { L ...
- HTTP中GET与POST的区别颠覆式的理解
关于http中的get和post你轻轻松松的给出了一个“标准答案”: GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被Bookmark,而POST不可以. GET ...