码迷,mamicode.com
首页 > 数据库 > 详细

sqlalchemy 使用

时间:2018-04-24 13:52:06      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:自定义   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?

SQLAlchemy 是一种对象关系映射模型(Object Relational Mapper), 简称ORM。

 

它展现了一种将用户定义的python中的类映射到数据库中表的方法。类的实例,就相当于表中的一行数据。简单来说呢, 就是让我们从SQL语句中抽离出来,只需要按照python的语法来写, 它会自动转换为相对应的SQL语句。

 

python中的类 == 数据库中的表
python中的类的属性 == 表中的字段
python中类的实例 == 表中的行

 

python中的ORM框架

SQLAlchemy呢, 仅仅是python的orm框架中的一种实现。关于python中其他的orm框架,可以看这个链接。

除了sqlalchemy, python还有哪些orm框架呢?

 

SQLAlchemy的使用

 

1. 所有的数据库操作, 我们首先要创建一个连接。 告诉我们的代码, 连接到我们数据库的路径。

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 : 允许连接到数据库的最大连接数.

 

2. 然后创建一个声明类,映射类到表的关系。

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

 

这又是一个什么东东呢? declarative_base()构造一个自定义的声明的类。说人话呢, 就是调用这个方法, 可以产生一个基类。这个基类,和它的子类,可以通过接受到的数据呢, 映射成一张表。

所以, 如果我们要操作数据库中的表, 我们都必须继承这个基类。

 

3. 定义我们的python类 - -> 数据库中的表

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的类, 也就是定义好了, 我们想要的表的格式。 下一步呢, 就是,把我们想要的这张表呢, 创建出来。

 

4 . 创建数据表

Base.metadata.create_all(engine)

蹬蹬蹬蹬, 一句话, 就可以根据我们之前的定义的元数据, 创建出我们要的数据表啦。

之前, 我总是搞不清楚, 什么是元数据。 难道数据还有圆的 ,方的吗, 哈哈。

元数据呢?

其实就是描述数据的数据。

比方说, 相片, 是数据吧。我们通过肉眼可以判断这这张照片和其他照片的区别。但是机器不可以呀, 机器呢, 要通过它的分辨率, 尺寸, RGB值,等等各种各种描述这张相片的数据区分出它和其他相片的区别。

我们要创建一张数据表, 什么样的数据表呢?

我们要告诉计算机, 我要的表叫什么名字, 在哪个数据库, 你可以怎么连接它。这些就是元数据啦。

 

现在我们已经有了数据表, 但是它是空的,所以, 我们要进行一些不可描述的操作啦。

敲黑板, 划重点, 划重点, SQLAlchemy的难点来了。

 

5 . 向表中插入数据。

先上代码。

   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()

 

6 . 查询数据

通过query关键字查询。

  • query.all(),all()返回列表
  • query.first():返回第一个元素
  • query.one()有且只有一个元素时才正确返回。

 

从数据库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()?

 

7.问题来了!如果这个数据表已经存在了,我并不想再定义一遍, 我只是需要查询该怎么办呢?

这个博客讲的很清楚啦, 我就不重复啦。

sqlalchemy 示例 | 你是有多喜欢玩游戏啊

sqlalchemy 使用

标签:自定义   raw   The   3.3   add   key   高级   %s   对象   

原文地址:https://www.cnblogs.com/php-linux/p/8929109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!