sqlalchemy - day1
一、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的更多相关文章
- sqlalchemy学习
sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
- 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)
第十二章 mysql ORM介绍 2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...
- Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- SQLAlchemy(一)
说明 SQLAlchemy只是一个翻译的过程,我们通过类来操作数据库,他会将我们的对应数据转换成SQL语句. 运用ORM创建表 #!/usr/bin/env python #! -*- coding: ...
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- sqlalchemy(二)高级用法
sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...
- sqlalchemy(一)基本操作
sqlalchemy(一)基本操作 sqlalchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型. 安装 需要安装MySQLdb pip install ...
- python SQLAlchemy
这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get ...
随机推荐
- Android 高级UI设计笔记19:PopupWindow使用详解
1. PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 2. PopupWindow使用 ...
- Debian 中添加ppa
在Debian8中默认没有"apt-add-repository"命令,所有也就没法安装ppa. 怎么破? sudo apt-get install software-proper ...
- Android Activity的启动过程
文章编辑的太长了,请移步我的csdn博客:http://blog.csdn.net/xyh269 Android Activity的启动过程原文链接:http://blog.csdn.net/xyh2 ...
- VsFTP+本地文件认证+SSl实现虚拟用户配置
1.实验环境: [root@node21 ~]# cat /etc/centos-release CentOS release 6.8 (Final) [root@node21 ~]# uname - ...
- ionic中的ion-content与ion-scroll
ion-content形成上下结构,上面固定,下层可滑动 首先要设置ion-content不可滑动:<ion-content class="has-subheader" sc ...
- React Native视频播放(iOS)
网站链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learn-react-native-video/ React Nativ ...
- 初识 Asp.Net内置对象之Session对象
Session对象 Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法相互访问.Session对象中止联机机器离现时,,也就是当网站使 ...
- Asp.net的内置对象!!!
还记得自己第一次面试的时候,面试官问的问题就是.net内置对象的问题,当时就让尴尬的要死... 所以作为新手的我们还是要知道这些轮廓的东西的! 1.Response对象 2.Request对象 3.A ...
- django 学习-15 .Django文件上传(用户注册)
1.vim blog/views.py from django.shortcuts import render_to_responsefrom django.http import HttpR ...
- “System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本” 的解决方案
在项目部署过程中ORACLE客户端多次会遇"System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本&qu ...