SQLAlchemy

SqlAlchemy 的使用可以在tornado,flask,在Django中也可以使用,此处只是简单介绍入门

1.环境搭建

安装相应的软件包

1.`mysql`数据库

2.`pymysql`用于连接`MySQL`服务器的一个库

3.`sqlalchemy`

$ pip install pymysql
$ pip install sqlalchemy
#python3

 2.连接数据库

#从sqlalchemy中导入create_engin,创建引擎建立与数据库的连接。

from sqlalchemy import create_engine

#准备连接数据库的数据:
HOSTNAME = '127.0.0.1'        # ip地址
PORT = '3306'                          # 端口号
DATABASE = 'mydb'                # 数据库名
USERNAME = 'admin'                 # 用户名
PASSWORD = 'rootqwe123'                 # 用户登录密码

DB_URI的格式:
#数据库类型+数据库驱动名称://用户名:密码@机器地址:端口号/数据库名?字符编码
DB_URI=`mysql+pymysql://<username>:<password>@<host>/<dbname>?charset=utf8` 

engine = create_engine(DB_URI)

#我们可以尝试着测试一下是否连接上:

print(dir(engine)) #当有打印出方法时,表示连接成功。

#connect.py

from sqlalchemy import create_engine

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mydb'
USERNAME = 'admin'
PASSWORD = 'Root110qwe'

DB_URI = 'mysql+pymysql://{}:{}@{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,DATABASE)

engine = create_engine(DB_URI)

if __name__=='__main__':
    print(dir(engine))

3.创建模型

3.1声明映像

对象关系型映射,数据库中的表与python中的类相对应,创建的类必须继承自sqlalchemy中的基类。

使用Declarative方法定义的映射类依据一个基类,这个基类是维系类和数据表关系的目录。
应用通常只需要有一个base的实例。我们通过declarative_base()功能创建一个基类。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(engine)

3.2 创建会话

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()

 

3.3 新建模型

新建一个user模型

import datetime
from sqlalchemy import Column,Integer,String,DateTime,Boolean
from connect import Base,session

class User(Base):
    __tablename__='user'
    id = Column(Integer,primary_key=True,autoincrement=True)
    username = Column(String(20),nullable=False)
    password = Column(String(100))
    creatime = Column(DateTime,default=datetime.now)
    last_login = Column(DateTime)
    _locked = Column(Boolean,default=Falsem,nullable=False)
    
#---将创建好的user类,映射到数据库的user表中---
Base.metadata.create_all()    

这就是创建好了一个表,我们可以在数据库中查看一下。

现在是往表里面添加数据:

def add_user():
    #添加单个对象
    #person = User(name='jingqi',number=11)
    #session.add(person)

    #添加多个对象
    session.add_all([User(name='jingjing',number=2),\
            User(name='xiaoming',number=3)])
    #提交才会生效,和命令行有区别
    session.commit()
add_user()

接下来是查询数据

def search_user():
    row = session.query(User).all()
    # print(row)
    row = session.query(User).filter_by(id=1).all()
    # print(row)

    row = session.query(User).filter(User.username=='jingqi').all()
    print(row[0].locked)

但其实我们可以在定义user类的时候这么去写

    @classmethod
    def all(cls):
        return session.query(cls).all()

    @classmethod
    def by_id(cls,id):
        return session.query(cls).filter_by(id=id).all()

    @classmethod
    def by_name(cls,name):
        return session.query(cls).filter_by(username=name).all()

    @property
    def locked(self):
        return self._locked

这样在只需要调用类方法就行

    print(User.all())
    print(User.by_id(1))
    print(User.by_name('jingqi'))
    print(User.by_name('jingjing'))

更新

def update_user():
    row = session.query(User).filter_by(username='jingqi').update({User.password:'jingqi123'})
    session.commit()

删除

def delete_user():
    row = session.query(User).filter_by(username='houguanglong')[0]  #first
    print(row)
    session.delete(row)
    session.commit()
posted @ 2017-12-12 22:19  随风无义  阅读(214)  评论(0)    收藏  举报