设为首页 收藏本站
查看: 616|回复: 0

[经验分享] python的sqlalchemy框架

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-14 08:50:49 | 显示全部楼层 |阅读模式
先看一下sqlalchemy框架中的映射,sqlalchemy一共有三种映射方式:传统映射(classic)、
现代化映射(modern)、自定义映射。
在这里,只为大家讲一下classic映射和modern映射。

classic映射:
顾名思义,就是类似于hibernate那样,要写好多配置文件,这里放一个小例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#coding=utf-8
from sqlalchemy import Table, MetaData, Column, Integer, String, DateTime  
from datetime import datetime  
from sqlalchemy.engine import create_engine  
'''''与数据库建立链接'''  
engine = create_engine("mysql://username:password@databasehost/databasename",isolation_level="READ UNCOMMITTED")   
'''''数据库表与对象之间的映射关系,类于hibernate中的xml配置文件'''  
metadata = MetaData()  
people = Table( #people  
                'people', metadata,  
                Column('id', Integer, primary_key=True),  
                Column('name', String(16), unique=True, nullable=False),  
                Column('gender', String(255), unique=True, nullable=True),  
                Column('created', DateTime, default=datetime.now)  
                )  
student = Table( #student  
                'student', metadata,  
                Column('id', Integer, primary_key=True),  
                Column('name', String(16), unique=True, nullable=False),  
                Column('gender', String(255), unique=True, nullable=True),  
                Column('created', DateTime, default=datetime.now)  
                )  
teacher = Table( #teacher  
                'teacher', metadata,  
                Column('id', Integer, primary_key=True),  
                Column('name', String(16), unique=True, nullable=False),  
                Column('gender', String(255), unique=True, nullable=True),  
                Column('created', DateTime, default=datetime.now)  
                )  
'''''创建数据库的类'''  
class People(object):pass  
class Student(object):pass  
class Teacher(object):pass  
'''''传统映射方式'''  
mapper(People,people)  
mapper(Student,student)  
mapper(Teacher,teacher)  
'''''创建表'''  
metadata.create_all(engine)



此时,如果我们再写一个*.py文件
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from dbproject.dbsetting import People,Teacher,engine
from sqlalchemy.orm import sessionmaker
people = People()
teahcer = Teacher()
people.name='renlei'
people.id=1
teahcer.name='laoshi'
teahcer.id=1
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
session.add(people)
session.add(teahcer)
session.flush()
session.commit()



编译运行这个python文件,就会发现数据库中的信息发生了相应变化。


modern映射:
如下,先写一个modern.py文件,代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#coding=utf-8
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.engine import create_engine
'''与数据库建立链接'''
engine = create_engine("mysql://username:password@databasehost/databasename",isolation_level="READ UNCOMMITTED")
'''数据库表结构'''
Base = declarative_base()
class People():#定义一个基类当然也可以不定义,这里只是给个例子
    id = Column(Integer, primary_key=True)
    name = Column(String(16))
    gender = Column(String(16))
    age = Column(String(16))
class User(Base,People):
    __tablename__ = 'users'
    fullname = Column(String(16))
    password = Column(String(16))
class AdvancedUser(Base,People):
    __tablename__ = 'advanceduser'
     
    fullname = Column(String(16))
    password = Column(String(16))
    email = Column(String(16))
     
class Teacher(Base,People):
    __tablename__ = 'teacher'
     
    phone = Column(String(16))
#创建所有的表
Base.metadata.create_all(engine)



接入来再写一个control.py文件,代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#coding=utf-8
from sqlalchemy.orm.session import sessionmaker
from modern import engine,User,AdvancedUser,Teacher
user = User()
user.name = 'username'
user.gender = 'male'
au = AdvancedUser()
au.name = 'auname'
au.gender = 'female'
teacher = Teacher()
teacher.name = 'wangdi'
teacher.gender = 'female'
teacher.phone = '15264397652'
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
session.add(user)
session.add(au)
session.add(teacher)
session.flush()
session.commit()



编译执行代码,会发现数据库内信息有变化,怎么样,与classic映射相比,这种写法是不是更方便啊。
这样,我们就可以省去大量的sql语句,直接使用python代码来完成。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314009-1-1.html 上篇帖子: python3_06_01.模块之os 下篇帖子: PYTHON 多线程信号量 python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表