Python学习_18 数据库操作(三)


Python学习_18 数据库操作(三)
1、ORM
ORM 即Object Relational Mapping,全称对象关系映射。
数据库中每次查出来的数据都用一个类表示,这个类的属性和数据库中表的字段一一对应。多条数据,就是一个list,每一行数据都是一个类来表示,如下所示:
class User(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name
[
    User(1, “ling”),
    User(2, “shang”),
    User(3, “huo”),
]
当我们需要获得id,或者name的时候,只需要通过循环获取到对象,直接通过user1.id或者user1.name就可以获取到id和name的属性。并且使得数据的存取非常的规范,这样ORM架构应用而生。
2、AQLAlchemy
Python中最有名的ORM架构就是SQLAlchemy
先安装模块
升级pip:
python -m pip install --upgrade pip  
然后安装SQLAlchemy
pip install  SQLAlchemy
初始化连接:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018\5\12 0012 1:26
# @Author : xiexiaolong
# @File : demon1.py

import sqlalchemy
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://yanzi:yanzi1097@193.112.207.252/yanzi')
sql = '''INSERT into test (id,name) VALUES ("0512","yanzi")'''
print(engine)
cus = engine.connect()
cus.execute(sql)
cus.close()
注:Djiango默认用的是MySQLdb,python3就会报错,需要 pymysql.install_as_MySQLdb()
另:python3需要写成 mysql+ pymysql://
3、通过ORM方式创建表格
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018\5\12 0012 1:26
# @Author : xiexiaolong
# @File : demon1.py

import sqlalchemy
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String

engine = create_engine('mysql+pymysql://yanzi:yanzi1097@193.112.207.252/yanzi')
metadata = MetaData(engine)
teacher = Table('teacher', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('age', Integer),
Column('sex', String(10)),
Column('name', String(50))
)
metadata.create_all(engine)
注: metadata.create_all(engine) 方法会判断操作的表是否存在,如果不存在则创建,如果存在则不创建
MetaData类主要用于保存表结构、连接字符串灯数据,是一个多表共享的对象
metadata = MetaData(engine)  绑定一个数据源的metadata
4、Column类
构造函数:
Column.__init__(self,  name,  type_,  *args,  **kwargs)
1、name 列名
2、type_ 类型,更多类型 sqlalchemy.types
3、*args Constraint(约束),  ForeignKey(外键),  ColumnDefault(默认), Sequenceobjects(序列)定义
4、key 列名的别名,默认None
下面是可变参数 **kwargs
5、primary_key 如果为True,则是主键
6、nullable 是否可为Null,默认是True
7、default 默认值,默认是None
8、index 是否是索引,默认是True
9、unique 是否唯一键,默认是False
10、onupdate 指定一个更新时候的值,这个操作是定义在SQLAlchemy中,不是在数据库里的,当更新一条数据时设置,大部分用于updateTime这类字段
11、autoincrement 设置为整型自动增长,只有没有默认值,并且是Integer类型,默认是True
12、quote 如果列明是关键字,则强制转义,默认False
5、创建会话
说到数据库,就离不开Session。Session的主要目的是建立与数据库的会话,它维护你加载和关联的所有数据库对象。它是数据库查询(Query)的一个入口。
在Sqlalchemy中,数据库的查询操作是通过Query对象来实现的。而Session提供了创建Query对象的接口。
Query对象返回的结果是一组同一映射(Identity Map)对象组成的集合。事实上,集合中的一个对象,对应于数据库表中的一行(即一条记录)。所谓同一映射,是指每个对象有一个唯一的ID。如果两个对象(的引用)ID相同,则认为它们对应的是相同的对象。
要完成数据库查询,就需要建立与数据库的连接。这就需要用到Engine对象。一个Engine可能是关联一个Session对象,也可能关联一个数据库表。
当然Session最重要的功能还是实现原子操作。
ORM通过session与数据库建立连接进行通信,如下所示:
from sqlalchemy.orm import sessionmaker
DBSession = sessionmaker(bind=engine)
session = DBSession()
通过sessionmake方法创建一个Session工厂,然后在调用工厂的方法来实例化一个Session对象
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018\5\12 0012 1:26
# @Author  : xiexiaolong
# @File    : demon1.py
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+ pymysql://yanzi:yanzi1097@193.112.207.252/yanzi ')
DBsession = sessionmaker(bind=engine)
session = DBsession()
Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    age = Column(Integer)
    address = Column(String(100))
student1 = Student(id=1001, name='yanzi', age=25, address="shenzh")
student2 = Student(id=1002, name='xie', age=18, address="beijing")
student3 = Student(id=1003, name='long', age=36, address="jiangxi")
session.add_all([student1,student2,student3])
session.close()
6、查询
通过Session的query()方法创建一个查询对象。这个函数的参数数量是可变的,参数可以是任何类或者是类的描述的集合。下面来看一个例子:
my_stdent = session.query(Student).filter_by(name="lingxiangxiang2").first()
print(my_stdent)
此时我们看到的输出结果是这样的:
<__main__.Student object at 0x032745F0>
前面我们在赋值的时候,我们可以通过实例化一个对象,然后直接映射到数据库中,那我们在查询出来的数据sqlalchemy直接给映射成一个对象了(或者是每个元素为这种对象的列表),对象和我们创建表时候的class是一致的,我们就也可以直接通过对象的属性就可以直接调用就可以了。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018\5\12 0012 1:26
# @Author  : xiexiaolong
# @File    : demon1.py
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+ pymysql://yanzi:yanzi1097@193.112.207.252/yanzi ')
DBsession = sessionmaker(bind=engine)
session = DBsession()
Base = declarative_base()
class Student(Base):
    __tablename__ = 'student'
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    age = Column(Integer)
    address = Column(String(100))
a = session.query(Student).filter(Student.id>1001).all()
print(a)
for i in a:
    print(i.id)
    print(i.name)
    print(i.age)
    print(i.address)
注:filter()  过滤表的条件
filter()和filter_by()的区别:
Filter:  可以像写 sql 的 where 条件那样写 > < 等条件,但引用列名时,需要通过 类名.属性名 的方式。
filter_by:  可以使用 python 的正常参数传递方法传递条件,指定列名时,不需要额外指定类名。,参数名对应名类中的属性名,但似乎不能使用 > < 等条件。
当使用filter的时候条件之间是使用“==",fitler_by使用的是"="。
user1 = session.query(User).filter_by(id=1).first()
user1 = session.query(User).filter(User.id==1).first()
filter不支持组合查询,只能连续调用filter来变相实现。
而filter_by的参数是**kwargs,直接支持组合查询。
比如:
q = sess.query(IS).filter(IS.node == node and IS.password == password).all()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中常用的数据库操作有以下几个步骤: 1. 导入数据库驱动:根据你使用的数据库类型,选择相应的数据库驱动,比如MySQL使用`import pymysql`,SQLite使用`import sqlite3`。 2. 连接数据库:使用数据库驱动提供的连接方法,连接到数据库。例如,使用pymysql连接MySQL数据库可以使用以下代码: ``` conn = pymysql.connect(host='localhost', user='user', password='password', database='dbname') ``` 3. 创建游标:通过连接对象创建游标对象,用于执行SQL语句。例如,使用pymysql可以使用以下代码: ``` cursor = conn.cursor() ``` 4. 执行SQL语句:通过游标对象调用`execute()`方法执行SQL语句。例如,执行查询语句可以使用以下代码: ``` cursor.execute('SELECT * FROM table_name') ``` 5. 获取执行结果:通过游标对象的`fetchone()`、`fetchall()`等方法获取执行结果。例如,获取查询结果可以使用以下代码: ``` result = cursor.fetchall() ``` 6. 提交事务:如果有修改操作,需要调用连接对象的`commit()`方法提交事务。例如,插入、更新、删除等操作后可以使用以下代码: ``` conn.commit() ``` 7. 关闭连接:使用完数据库后,需要关闭连接。例如,使用pymysql可以使用以下代码: ``` conn.close() ``` 以上是一个基本的Python数据库操作流程。具体的操作和语法会因不同的数据库类型而有所差异,请根据你使用的数据库类型进行相应的查询和学习

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值