一、Create engine

    Database url规则: dialect+driver://username:password@host:port/database

    echo: True表示cmd窗口显示出对应的SQL 脚本信息

 from sqlalchemy import create_engine

 # Database url: dialect+driver://username:password@host:port/database
# eq: mysql+pymysql://purk:max123@local/test
# 在内存中创建一个sqllite
# engine = create_engine('sqlite:///:memory:', echo=True)
# F:/test.db 如果test.db不存在,则创建一个。
engine = create_engine('sqlite:///F:/test.db', echo=True)

二、create mapping class

 from sqlalchemy import Column, Integer, String, Table
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Person(Base):
__tablename__ = 'person' id = Column(Integer, primary_key=True)
name = Column(String(50)) class User(Base):
__tablename__='user' id = Column(Integer, primary_key=True)
name = Column(String(50))
 >>> Person.__table__
Table('person', MetaData(bind=None), Column('id', Integer(), table=<person>, primary_key=True, nullable=False), Column('name', String(length=50), table=<person>), schema=None) >>> Person.metadata is User.metadata
True >>> Person.metadata is Base.metadata
True

传统的mapper configuration 就不介绍了,因为不直观,而且代码量还长,下面只贴出官网的例子

 from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
from sqlalchemy.orm import mapper
metadata = MetaData()
user = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('fullname', String(50)),
Column('password', String(12))
) class User(object): def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
mapper(User, user)

三、Column

  1. DataType

    1) Integer

        id = Column(Integer)

    2) String

        name = Column(String(50))

      3) Boolean

gender = Column(Boolean)

 person = Person(name='purk', gender=0)
person1 = Person(name='purk1', gender=11)
person2 = Person(name='purk2', gender=-1)
# try:
# person3 = Person(name='purk3', gender='123')
# except Exception as e:
# print('boolean类型在数据库中对应的smartint或boolean类型,输入字符串是不对的')
db.add_all([person, person1, person2])
db.commit()

结果如下

 person_1 = db.query(Person).filter(Person.name == 'purk').first()
person_2 = db.query(Person).filter(Person.name == 'purk1').first()
person_3 = db.query(Person).filter(Person.name == 'purk2').first()
print(person_1.gender)
print(person_2.gender)
print(person_3.gender)

查询 结果如下,满足boolean类型的一贯判断,非0即1.

      4) Date  -> datetime.date()

          赋值可以使用python的date对象,也可以直接使用日期的字符串'2016-10-21',不过从数据库里面取出来的结果集该字段一定是python的date类型,这样在json或xml序列化的时候会有问题。

          birthday = Column(Date())

5) DateTime -> datetime.datetime()   同 Date.

          create_date = Column(DateTime(), default=datetime.now)        default: 默认值,相当于在为给定值时赋予的默认值
          modify_date = Column(DateTime(), onupdate=datetime.now)    onupdate:在每次update时默认赋予的值,注,如果该字段已经被赋值,则不会再用默认值

 birthday = Column(Date())
create_date = Column(DateTime(), default=datetime.now)
modify_date = Column(DateTime(), onupdate=datetime.now) person = Person(name='purk', gender=True, level='')
person1 = Person(name='purk1', gender=False, level=0)
person2 = Person(name='purk2', gender=False, level=1)
person3 = Person(name='purk3', gender=False, level=4)
person4 = Person(name='purk4', gender=-1, level='medium')
db.add_all([person, person1, person2, person3, person4])
db.commit() db.query(Person).filter(Person.name == 'purk').update({Person.birthday: date.today()})
person_1 = db.query(Person).filter(Person.name == 'purk1').first()
person_1.birthday = '2016-10-27'
person_1.modify_date = '2016-10-27 15:00:05' #update时给定值
db.merge(person_1)
db.commit()

结果如下

      6) Enum

          level_list = ('low', 'medium', 'high')

          level = Column(Enum(*level_list))

 person = Person(name='purk', gender=True, level='')
person1 = Person(name='purk1', gender=False, level=0)
person2 = Person(name='purk2', gender=False, level=1)
person3 = Person(name='purk3', gender=False, level=4)
person4 = Person(name='purk4', gender=-1, level='medium')

Enum的index是从1开始的,越界的或者值不在枚举列中的都保存为null了

7)Float

        menoy = Column(Float())

     8) Unicode

        data = Column(Unicode(200)) #目前测试的是Unicode 和String是一样样的,值得注意的是这两类型赋值可以是Byte类型的。

 name = Column(String(50))
data = Column(Unicode(200)) person = Person(name='purk撒旦法撒旦法'.encode(), gender=True, level='', data='asdf123')
person1 = Person(name='purk1', gender=False, level=0, data='asdf123是打发斯蒂芬'.encode()) person_1 = db.query(Person).filter(Person.name == 'purk1').first()
print(person_1.data)

结果是

主要且常用的type我总结了一下,不常用的和我没研究懂得就pass咯。。。

sqlalchemy - day1的更多相关文章

  1. sqlalchemy学习

    sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...

  2. tornado+sqlalchemy+celery,数据库连接消耗在哪里

    随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知.     最近老是发现数据库的连接数如果 ...

  3. 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)

    第十二章  mysql ORM介绍    2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...

  4. Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  5. SQLAlchemy(一)

    说明 SQLAlchemy只是一个翻译的过程,我们通过类来操作数据库,他会将我们的对应数据转换成SQL语句. 运用ORM创建表 #!/usr/bin/env python #! -*- coding: ...

  6. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  7. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  8. sqlalchemy(一)基本操作

    sqlalchemy(一)基本操作 sqlalchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型. 安装 需要安装MySQLdb pip install ...

  9. python SQLAlchemy

    这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get ...

随机推荐

  1. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码

    来自:http://www.cnblogs.com/lcxu2/archive/2011/01/16/2004016.html 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或 ...

  2. Redis缓存异常的容错实现方法( .net)

    using DotNet.Log; /// <summary> /// Redis缓存辅助类 /// /// 修改纪录 /// /// 2015-10-26 版本:1.0 SongBiao ...

  3. DataContractJsonSerializer和JavaScriptSerializer内部实现差异

    定义一个下面这样的类,此类有Serializable属性,并且有一个属性的定义没有使用自动属性来实现. [Serializable] public class Users { public int U ...

  4. 【Android Api 翻译3】android api 完整翻译之Application Fundamentals (学习android必须知道的)

    Android应用程序是用Java编程语言编写的.Android SDK工具把应用程序的代码.数据和资源文件一起编译到一个Android程序包中(这个程序包是以.apk为后缀的归档文件),一个Andr ...

  5. Android学习笔记⑥——UI组件的学习ImageView相关

    ImageView是集成了View的组件,它的主要工作就是显示一些图片啊,虽然他的用法一句话概括了,但是我觉得学起来应该不会太简单,正所谓 短小而精悍么 :) ImageView 派生了 ImageB ...

  6. apply和call的区别在哪里

    apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数obj:这个对象将代替Function类里this对象args:这 ...

  7. React Native学习-将 'screen', 'window' or a view生成图片

    https://github.com/facebook/react-native/commit/ac12f986899d8520527684438f76299675dc0daa 这是react-nat ...

  8. Phd之导师的作用

    1.研究技巧(专业知识,研究方向,方法论,写作技巧和演讲技巧) 当导师手下的学生少时,他可能会手把手的叫你一些知识,导师手下的学生多时,他会让你自己去学习某个领域的知识.当你掌握了一定专业知识后,导师 ...

  9. css 雪碧图的制作

    很多网站其实都用了雪碧图,确实方便了制作,以前以为这种小图标,都是一个一个图片呢(笑) 效果图如下: 代码如下: <html> <head lang="en"&g ...

  10. 移动端开发,几个你可能不知道的CSS单位属性。

    1. rem "em" 单位是我们开发中比较常用到的,它表示以当前元素的父元素的单位大小为基准来设置当前元素的大小:“rem” 中的 “r” 代表 “root”,它表示以根(即“h ...