查看版本

  1. >>> import sqlalchemy
  2. >>> sqlalchemy.__version__
  3. '1.0.9'

创建连接

  1. from sqlclachemy import create_engine
  2. engine = create_engine("sqlite:///:memory:", echo=True)

‘sqlite:///:memory:’ 是 database URL

postgresql

sqlalchemy 默认使用 psycopg2

  1. # 默认情况(即使用psycopg2)
  2. engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')
  3. # 使用psycopg2
  4. engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
  5. # 使用pg8000
  6. engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')

MySQL

默认使用mysql-python

  1. # 默认情况(即使用mysql-python)
  2. engine = create_engine('mysql://scott:tiger@localhost/foo')
  3. # 使用mysql-python
  4. engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
  5. # 使用MySQL-connector-python
  6. engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo')
  7. # 使用OurSQL
  8. engine = create_engine('mysql+oursql://scott:tiger@localhost/foo')

Oracle

默认使用cx_oracle

  1. 默认情况(即使用cx_oracle
  2. engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')
  3. # 使用cx_oracle
  4. engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname')

Microsoft SQL Server

默认使用pyodbc

  1. # 使用pyodbc
  2. engine = create_engine('mssql+pyodbc://scott:tiger@mydsn')
  3. # 使用pymssql
  4. engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')

SQLite

因为sqlite是基于文件的数据库,所以database URL 和前面的不太一样。

  1. # database URL 形式是 sqlite://<nohostname>/<path>
  2. engine = create_engine('sqlite:///foo.db')
  3. # 在Unix/Mac
  4. engine = create_engine('sqlite:////absolute/path/to/foo.db')
  5. # 在Windows
  6. engine = create_engine('sqlite:///C:\\path\\to\\foo.db')
  7. # 在Windows 中使用原始字符串
  8. engine = create_engine(r'sqlite:///C:\path\to\foo.db')
  9. # 使用内存
  10. engine = create_engine('sqlite://')
  11. engine = create_engine('sqlite:///:memory:')

创建表

使用ORM,需要首先描述表,然后把类映射到表上。在SQLAclhemy中这两步通常在一起,使用叫做Declarative的系统,可以让我们创建一个包含描述我们需要创建表的类

创建declarative base class

需要先创建基类

  1. from sqlalchemy.ext.declarative import declarative_base
  2. Base = declarative_base()

创建类

比如创建User类,User类需要继承前面创建的Base。

  1. from sqlalchemy import Column, Integer, String
  2. class User(Base):
  3. __tablename__ = 'users'
  4. id = Column(Integer, primary_key=True)
  5. name = Column(String)
  6. fullname = Column(String)
  7. password = Column(String)
  8. def __repr__(self):
  9. return "<User(name='%s', fullname='%s', password='%s')>" % (
  10. self.name, self.fullname, self.password)

需要使用tablename 指名表名。Column 表明字段。

当声名ORM的类时,Declarative系统会使用python的元类,创建一个包含表信息的Table类(可以通过User.table_ 查看),然后通过Mapper把这个Table与ORM的类联系起来。所有ORM类的Table类都包含在一个MetaData类中,通过Base.metadata 可以查看MetaData类

对于SQLAlchemy ORM来说Declarative 系统不是必须的,比如:

  1. from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
  2. from sqlalchemy.orm import mapper
  3. metadata = MetaData()
  4. user = Table('user', metadata,
  5. Column('id', Integer, primary_key=True),
  6. Column('name', String(50)),
  7. Column('fullname', String(50)),
  8. Column('password', String(12))
  9. )
  10. class User(object):
  11. def __init__(self, name, fullname, password):
  12. self.name = name
  13. self.fullname = fullname
  14. self.password = password
  15. mapper(User, user)

创建User表

  1. Base.metadata.create_all(engine)

基本的CURD操作

需要创建一个session来对表进行操作

创建一个session

  1. from sqlalchemy.orm import sessionmaker
  2. Session = sessionmaker(bind=engine)
  3. Session = sessionmaker()
  4. '''or
  5. Session = sessionmaker()
  6. Session.configure(bind=engine)
  7. '''
  8. session = Session()

插入数据

  1. ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
  2. session.add(ed_user)

一次添加多行

  1. session.add_all([
  2. User(name='wendy', fullname='Wendy Williams', password='foobar'),
  3. User(name='mary', fullname='Mary Contrary', password='xxg527'),
  4. User(name='fred', fullname='Fred Flinstone', password='blah')])

此时数据是没有插入到数据库中的,ed_user.id 是为None的。如果想真正插入数据库中需要commit。

  1. session.commit()

如果想要操作只是在内存中,不真正commit,ed_user.id 不为None,可以使用flush操作,它只是写到内存中。

  1. session.flush()

回滚操作

当没有commit之前,可以回滚

  1. session.rollback()

读取操作,Querying

执行query操作之前会自动执行flush。 
query例子:

  1. for instance in session.query(User).order_by(User.id):
  2. print(instance.name, instance.fullname)
  3. # 可以只取其中的某些字段
  4. for name, fullname in session.query(User.name, User.fullname):
  5. print(name, fullname)
  6. for row in session.query(User, User.name).all():
  7. print(row.User, row.name)
  8. for row in session.query(User.name.label('name_label')).all():
  9. print(row.name_label)

可以使用alias对表取别名,可以在表join本身时用。

  1. from sqlalchemy.orm import aliased
  2. user_alias = aliased(User, name='user_alias')
  3. for row in session.query(user_alias, user_alias.name).all():
  4. print(row.user_alias)

使用filter_by筛选

  1. for name, in sesson.query(User.name).filter_by(fullname='Ed Jones'):
  2. print(name)

也可以使用filter,它更加的灵活

  1. for name, in sesson.query(User.name).filter(User.fullname=='Ed Jones'):
  2. print(name)
  1. #相等
  2. query.filter(User.name == 'ed')
  3. #不相等
  4. query.filter(User.name != 'ed')
  5. #like
  6. query.filter(User.name.like('%ed%'))
  7. #in
  8. query.filter(User.name.in_(['ed', 'wendy', 'jack']))
  9. query.filter(User.name.in_(
  10. session.query(User.name).filter(User.name.like('%ed%'))
  11. ))
  12. #not in
  13. query.filter(~User.name.in_(['ed', 'wendy', 'jack']))
  14. #IS NULL
  15. query.filter(User.name == None)
  16. query.filter(User.name.is_(None))
  17. #IS NOT NUKK
  18. query.filter(User.name != None)
  19. query.filter(User.name.isnot(None))
  20. #And
  21. from sqlalchemy import and_
  22. query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))
  23. query.filter(User.name == 'ed', User.fullname == 'Ed Jones')
  24. query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')
  25. #OR
  26. from sqlalchemy import or_
  27. query.filter(or_(User.name == 'ed', User.name == 'wendy'))
  28. #Match
  29. query.filter(User.name.match('wendy'))

返回列表

all() 操作,一次取出所有,返回一个列表。

  1. query = session.query(User).filter(Usre.name.like('%ed%')).all()

first() 取出第一个,如果没有就返回None

  1. obj = query.first()

one() 取出一个,如果筛选的结果不只一个,报MultipleResultsFound错,如果没有报NoResultFound 错 
one_or_none() 取出一个,如果筛选的结果不只一个,报MultipleResultsFound错,如果没有返回None 
scalar() 跟one_or_none() 一样

使用原始的sql

  1. query = session.query(User).filter('id<200').order_by(text('id')).all()

使用参数

  1. query = session.query.(User).filter(text('id<:value and name=:name')).params(value=224, name='fred').order_by(User.id).one()

使用完全基于string

  1. query = session.query(User).from_statement(
  2. text('SELECT * FROM users where name=:name').params(name='ed').all()
  3. ).all()

count

  1. count = session.query(User).filter(User.name.like('%ed%')).count()
  1. from sqlalchemy import func
  2. query = session.query(func.count(User.name), User.name).group_by(User.name).all()
  1. session.query(func.count('*')).select_from(User).scalar()
  1. session.query(func.count(User.id)).scalar()

更新

  1. user.name = 'haha'
  2. session.commit()

删除

  1. session.delete(user)
 

SQLAlchemy数据库连接和初始化数据库的更多相关文章

  1. 【笔记】python的sqlalchemy数据库连接池原理的说明

    sqlalchemy数据库连接池的使用方式是延迟初始化,就是说一开始你调用create_engine(...)后创建的那个数据库池是空的,你后面通过session.connection()或者engi ...

  2. 利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题

    问题的描述: 一个项目,涉及到了 两个数据源,分别使用的是 两个不同的 数据库连接池,其中一个是 poxool 连接池,问题在于,spring在启动时,只初始化其中的一个 数据库连接池中的数据库连接, ...

  3. Entity FrameWork初始化数据库的四种策略

    程序猿就是苦逼,每天还得分出一些时间去写博文.天真的很热,今天就随便写一点啦! 1.EF初始化数据库的四中策略 EF可以根据项目中的模型自动创建数据库.下面我们就分类看看Entity Framewor ...

  4. SQLAlchemy通过models创建数据库表

    原地址:http://blog.csdn.net/jmilk/article/details/53184903 定义数据模型 models SQLAlchemy 允许我们根据数据库的表结构来创建数据模 ...

  5. 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库

    采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...

  6. C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

    数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...

  7. activiti搭建(一)初始化数据库

    转载请注明源地址:http://www.cnblogs.com/lighten/p/5876681.html activiti-engine.jar包中自带了创建activiti工作流数据库表的SQL ...

  8. ASP.NET 5:初始化数据库

    ASP.NET 5:初始化数据库 1.初始化数据库 1.2目录 这不是专述模式/架构设计的帖子,架构搭建以讲解文章为目的,先不过多分层. 截这个图也是便于你对应下面找代码文件路径! 1.2代码 先控制 ...

  9. 【EF6学习笔记】(一)Code First 方式生成数据库及初始化数据库实际操作

    本篇参考原文地址: Creating an Entity Framework Data Model 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整 ...

随机推荐

  1. Python之str方法

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之str方法 #http://python.jobbole.com/82655/ #str为一个 ...

  2. asp.net MVC在IIS7或7.5上的发布问题

    按照网上的做法,开启了ISAPI和CGI限制C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll 应用程序池也设置好了,可是就是 ...

  3. DIV+CSS专题:十天学会DIV+CSS

    DIV+CSS专题:十天学会DIV+CSS,在网上看到的.感觉蛮好,推荐一下. 十天学会DIV+CSS(WEB标准)CHM格式文件下载 第十天 div+css网页标准布局实例教程(三) 第十天 div ...

  4. WordPress 主题教程:从零开始制作 WordPress 主题

    为什么要开发WordPress主题? WordPress主题由一系列文件和样式表单组成,这些文件和样式表单共同作用生成WordPress网站的外观.每个主题都不同,用户可以通过这些主题随心所欲地更换自 ...

  5. Linux系统CentOS6.2版本下安装JDK7详细过程

    Linux系统CentOS6.2版本下安装JDK7详细过程 分类: Linux 2014-08-25 09:17 1933人阅读 评论(0) 收藏 举报 前言:        java 是一种可以撰写 ...

  6. Asp.Net中using的使用的方法(转)

    摘自:http://blog.sina.com.cn/s/blog_6aa9c73801018ggw.html 一.强制资源整理(实用性非常强,希望大家多多使用,比try-catch-finaly效率 ...

  7. Web前端开发笔试&面试_02(others)

    AL>> 1.CSS 3 如何实现旋转图片? 答:transform : rotate 2.写CSS 的工具? 答:LESS.SASS 3.JavaScript 倒计时? 答:setTim ...

  8. WordPress网站搬家的问题

    老邢的博客搬家全过程(wordpress搬家知识总结)   网站搬家过程中的几个问题   WordPress网站搬家的方法   WORDPRESS.ORG - zh-cn:WordPress 博客搬家 ...

  9. @Html.Display @Html.LabelFor @Html.EditorFor Html.DisplayForModel Html.LabelForModel Html.EditorForModel

  10. 转:Web优化 及常用工具包

    Web优化: 减少http请求 避免404错误 在html页面header加入缓存标签 Gzip压缩网页 减少cookie体积 使用外部的js和css 消减js和css 压缩js 使用css spri ...