标签:自定义 raw The 3.3 add key 高级 %s 对象
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String, Integer from sqlalchemy.orm import sessionmaker engine = create_engine(‘mysql+mysqldb://root:root@192.168.33.30:3306/python‘,echo=True) Base = declarative_base() class User(Base): __tablename__ = ‘user‘ id = Column(Integer, primary_key=True) name = Column(String(64), nullable=False, index=True) def __repr__(self): return ‘%s(%r)‘ % (self.__class__.__name__, self.username) #Base.metadata.create_all(engine) # 创建session对象: DBSession = sessionmaker(bind=engine) session = DBSession() # 创建新User对象: new_user = User(id=‘1‘, name=‘Bob‘) # 添加到session: session.add(new_user) # 提交即保存到数据库: session.commit() # 关闭session: session.close()
SQLAlchemy 是一种对象关系映射模型(Object Relational Mapper), 简称ORM。
它展现了一种将用户定义的python中的类映射到数据库中表的方法。类的实例,就相当于表中的一行数据。简单来说呢, 就是让我们从SQL语句中抽离出来,只需要按照python的语法来写, 它会自动转换为相对应的SQL语句。
python中的类 == 数据库中的表
python中的类的属性 == 表中的字段
python中类的实例 == 表中的行
SQLAlchemy呢, 仅仅是python的orm框架中的一种实现。关于python中其他的orm框架,可以看这个链接。
除了sqlalchemy, python还有哪些orm框架呢?
from sqlalchemy import create_engine
engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8",
echo=True)
create_engine的可选参数很多, 有几个比较常用的。
echo: True的时候,会打印所有的状态变化, 包括转换的SQL语句。 一般在生产环境中呢,我们是把它设置为Flase的。
max_overflow : 允许连接到数据库的最大连接数.
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
这又是一个什么东东呢? declarative_base()构造一个自定义的声明的类。说人话呢, 就是调用这个方法, 可以产生一个基类。这个基类,和它的子类,可以通过接受到的数据呢, 映射成一张表。
所以, 如果我们要操作数据库中的表, 我们都必须继承这个基类。
from sqlalchemy import Column, Integer, String
class Phone_Table(Base):
# 表名
__tablename__ = phone_table
id = Column(String(255), primary_key=True, unique=True)
item_id = Column(String(10))
name = Column(String(120))
crawl_time = Column(String(100))
def __int__(self, id, item_id, name, price, type, phone, operator, location,
portal, Relevance, crawl_time):
self.id = id
self.item_id = item_id
self.name = name
self.crawl_time = crawl_time
每个类一定要有__tablename__!!! 也就是一定要有表名。
Column : 代表数据表中的一列。
它的常用参数有:
autoincrement : True . 表示这个字段是自增的。
index : True. 设置这个字段为索引。
nullable : True. 允许次字段为空。
primary_key : True. 设置此字段为主键。非常值得注意的是!!!! SQLAlchemy中, 每个类中至少有一个主键!!!
unique : True. 设置此字段唯一。此字段相同的数据,第一条数据插入后, 之后的就不允许再插入了, 直接 pass 掉。
sqlalchemy中, 关于我们平时常见的字段类型都有。
String , Text, Integer, Float, DateTime, Boolean 等等等等。。。
如果, 我有时间的话。。。以后就作为高阶一起讲吧。
现在, 我们指定了去往我们数据库的路径, 作为engine。写好了python的类, 也就是定义好了, 我们想要的表的格式。 下一步呢, 就是,把我们想要的这张表呢, 创建出来。
Base.metadata.create_all(engine)
蹬蹬蹬蹬, 一句话, 就可以根据我们之前的定义的元数据, 创建出我们要的数据表啦。
之前, 我总是搞不清楚, 什么是元数据。 难道数据还有圆的 ,方的吗, 哈哈。
元数据呢?
其实就是描述数据的数据。
比方说, 相片, 是数据吧。我们通过肉眼可以判断这这张照片和其他照片的区别。但是机器不可以呀, 机器呢, 要通过它的分辨率, 尺寸, RGB值,等等各种各种描述这张相片的数据区分出它和其他相片的区别。
我们要创建一张数据表, 什么样的数据表呢?
我们要告诉计算机, 我要的表叫什么名字, 在哪个数据库, 你可以怎么连接它。这些就是元数据啦。
现在我们已经有了数据表, 但是它是空的,所以, 我们要进行一些不可描述的操作啦。
敲黑板, 划重点, 划重点, SQLAlchemy的难点来了。
先上代码。
DBSession = sessionmaker(bind=engine)
session = DBSession()
这有是什么鬼呢?
首先, 我们可以根据字面意思看到。会话制造工厂。然后实例了session。其实也挺形象的。
sessionmaker 是一个可以不断产生新会话的类。
在我们初学一门语言时, 一定会学习如何用它去连接数据库。这个过程,我们首先需要连接到数据库, 这就好比是修路, 然后我们需要获得一个cursor(游标),就好比是通车。这样,我们才能与数据库之间通信。
而在sqlaAlchemy中, 我们通过create_engine 建立连接, 通过会话来建立自己代码与数据库的通信(其实, 和游标的作用很相似)。
现在我们有了路, 也有了车。
1.写入一行的数据。------> 实例化我们定义的声明类
# dic 字典形式的数据。
dic = {}
item = Phone_Table(id=id, item_id=dic[‘item_id‘], name=dic[‘item_name‘],
crawl_time=dic[‘crawl_time‘])
2. 把数据放上车 (sqlAlchemy是lazy的)
session.add(item)
3.老司机开车, 触发insert 语句。
session.commit()
4. 开完车, 收车。
session.close()
通过query关键字查询。
从数据库query的数据, 通过老司机的车session, 运送到我们这里。
session.query(Phone_Table)
如果我们只想要查询其中几个字段
session.query(Phone_Table.id, Phone_Table.item_id)
我现在又想查询名字为隔壁老王的所有信息。
session.query(Phone_Table).filter(Phone_Table.name==‘隔壁老王‘)
查询隔壁老王与阿娇的所有通话时间的记录
session.query(Phone_Table.crawl_time).filter_by(name=‘隔壁老王‘).all()
欸?怎么一个filter , 一个filter_by.
filter_by 呢? 通过列表做一些简单的查询。
filter 可以做filter_by做的事情, 同时它还能兼容一些sql的语法。
同时, 我们可以看到。
filter 中是 == , 这意味着它接受可选数量的表达式,你可使用sql表达式或者keyword表达式。
column == expression
filter_by 中是 = 接受一个关键字
keyword = expression
What's the difference between filter and filter_by in SQLAlchemy?
还有许多高级用法没讲, 不过到这里日常简单使用差不多啦。之后等我用到了, 总结了再讲吧。太晚太晚了, 困得不行。看会极限挑战就去睡觉啦。最后, 留下stackoverflow 一个不错的讨论
flash 和 commit 的讨论。
SQLAlchemy: What's the difference between flush() and commit()?
这个博客讲的很清楚啦, 我就不重复啦。
标签:自定义 raw The 3.3 add key 高级 %s 对象
原文地址:https://www.cnblogs.com/php-linux/p/8929109.html