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

python ORM - sqlalchemy 操作使用

时间:2018-03-10 17:44:36      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:meta   comm   commit   connect   com   时间   password   实例   映射   

python操作数据库

使用 ORM - sqlalchemy,pymsql

安装:

pip install pymsq
pip install sqlalchemy

一、 ‘‘‘连接数据库‘‘‘

 ‘‘‘导入必须的包‘‘‘
from
sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker
# 基本设置 
HOSTNAME = 127.0.0.1   # 本地 liunx
POST = 3306            # mysql 默认端口
DATABASE = mydb        # 数据库名字
USERNAME = admin       # 用户名
PASSWORD = Root110qwe  # 密码
# 固定写法
db_url = mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8.format( USERNAME, PASSWORD, HOSTNAME, POST, DATABASE )
# 这里的 db_url 就是连接数据库的路径。“mysql+mysqldb”指定了使用 MySQL-Python 来连
engine = create_engine(db_url,echo=False)   # 初始化数据库连接, 
# create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。
Base = declarative_base(engine) # 创建对象的基类
Session = sessionmaker(engine) # 创建与数据库连接的Session类
session = Session() # session可以视为数据库连接
# sessionmaker() 会生成一个数据库会话类。这个类的实例可以当成一个数据库连接,它同时还记录了一些查询的数据,并决定什么时候执行 SQL 语句。
if __name__ == __main__:  # 测试是否连接成功
    connection = engine.connect()
    result = connection.execute(select 1)
    print(result.fetchone())



二 、 ‘‘‘创建 类—表 映射关系‘‘‘

 

     创建表的同时,也映射数据库;也可以单独创建表,

# -*- coding:utf-8 -*-

from datetime import datetime
from sqlalchemy import Column,Integer,String,DateTime 
from connect import Base,session # 这里connect前面加上点之后 不能直接执行文件,但是可以外部调用


‘‘‘创建表 user ‘‘‘
class User(Base):

    __tablename__ = user
    id = Column(Integer,primary_key=True,autoincrement=True) #主键 ,自增长
    username = Column(String(20),nullable=False) # 用户名长度 20 、非空
    password = Column(String(50)) # 密码长度 50
    creatime = Column(DateTime,default=datetime.now) # 创建时间

    @classmethod
    def by_name(cls,name): # 定义查询函数,返回查询结果
        return session.query(cls).filter(cls.username==name).first()

    def __repr__(self): # 重写repr 便于阅读
        return "<User(id=%s,username%s,password=%s,createtime=%s)>" % (
            self.id,
            self.username,
            self.password,
            self.creatime
        )

from sqlalchemy.orm import relationship
from sqlalchemy import ForeignKey


‘‘‘创建表 user_details ‘‘‘
class UserDetails(Base):

    __tablename__=user_details
    id = Column(Integer, primary_key=True, autoincrement=True)
    id_card = Column(Integer,nullable=True,unique=True)
    lost_login = Column(DateTime)
    login_num = Column(Integer,default=0)
    user_id = Column(Integer,ForeignKey(user.id))

    ‘‘‘
    User 要关联的表的名字
    backref 返回 details 方法(属性)
    uselist 默认为True, 表示一对多关系(False表示一对一)
    cascade 自动处理关系 相当于mysql中的ON DELETE 类似 有 7 个可选参数
    在代码层控制
    ‘‘‘
    userdetail = relationship(User,backref=details,uselist=False,cascade=all)

    def __repr__(self):  # 重写repr 便于阅读
        return <UserDetails(id=%s,id_card=%s,last_login=%s,login_num=%s,user_id=%s)>%(
            self.id,
            self.id_card,
            self.lost_login,
            self.login_num,
            self.user_id
        )


from sqlalchemy import  Table

‘‘‘ 创建表的另一种方法 这种方法没有映射,如果需要映射 还需重新创建 类,重写 repr‘‘‘
user_article = Table(user_article,Base.metadata,
     Column(user_id,Integer,ForeignKey(user.id),primary_key=True),
     Column(article_id,Integer,ForeignKey(article.id),primary_key=True)
 )


‘‘‘创建表 article ‘‘‘
class Article(Base):

    __tablename__ = article
    id = Column(Integer,primary_key=True,autoincrement=True)
    content = Column(String(50),nullable=True)
    create_time = Column(DateTime,default=datetime.now())

    article_user = relationship(User,backref=article,secondary=user_article)# 创建映射关系

    def __repr__(self):  # 重写repr 便于阅读
        return  Article(id=%s,content=%s,create_time=%s)%(
            self.id,
            self.content,
            self.create_time
        )


if __name__ == __main__:
    Base.metadata.create_all() # 执行

 

三 、 ‘‘‘简单的 增、删、查、改 操作 ‘‘‘

 

 

# -*- coding:utf-8 -*-
from connect import session
from user_module import User

def add_user(): #
    # persson = User(username=‘xiaohong‘,password=‘qwe123‘,id=1)
    # session.add(persson)  # 提交单条数据

    # 一次提交多条数据 , 注意 这里 all 里面是列表
    session.add_all(
        [
        User(username=小红, password=qwe123mmm),
        User(username=老王, password=12345nnnnn),
        User(username=小明, password=654321hhhhh),
        ]
    )
    session.commit() # 必须提交

def search_user(): # 查询 默认repr 便于机器阅读,需要重写
    rows = session.query(User).all()
    print(rows)

def update_user(): #
    session.query(User).filter(User.id==2).update({User.password:1})
    session.commit()

def delete_user(): # 删除
    # rows = session.query(User).filter(User.id==2)[0]
    rows = session.query(User).all()
    print(rows)
    for i in rows: # 如果查到的数据量大,就是用循环删除 
        session.delete(i)
    session.commit()


if __name__ == __main__:
    add_user()
    # search_user()
    # delete_user()
    # update_user()

 

 

 

 

 

 

 

推荐文章:廖雪峰的  使用SQLAlchemy 

       脚本之家的   Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

       z+j  的  Python SqlAlchemy使用方法

      K.TakanashiSQLAlchemy的初步使用 

     SQLAlchemy入门(一)

 

python ORM - sqlalchemy 操作使用

标签:meta   comm   commit   connect   com   时间   password   实例   映射   

原文地址:https://www.cnblogs.com/zlsgh/p/8538911.html

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