SQLAlchemy数据库连接和初始化数据库
查看版本
>>> import sqlalchemy
>>> sqlalchemy.__version__
'1.0.9'
创建连接
from sqlclachemy import create_engine
engine = create_engine("sqlite:///:memory:", echo=True)
‘sqlite:///:memory:’ 是 database URL
postgresql
sqlalchemy 默认使用 psycopg2
# 默认情况(即使用psycopg2)
engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')
# 使用psycopg2
engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
# 使用pg8000
engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')
MySQL
默认使用mysql-python
# 默认情况(即使用mysql-python)
engine = create_engine('mysql://scott:tiger@localhost/foo')
# 使用mysql-python
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
# 使用MySQL-connector-python
engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo')
# 使用OurSQL
engine = create_engine('mysql+oursql://scott:tiger@localhost/foo')
Oracle
默认使用cx_oracle
# 默认情况(即使用cx_oracle)
engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')
# 使用cx_oracle
engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname')
Microsoft SQL Server
默认使用pyodbc
# 使用pyodbc
engine = create_engine('mssql+pyodbc://scott:tiger@mydsn')
# 使用pymssql
engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')
SQLite
因为sqlite是基于文件的数据库,所以database URL 和前面的不太一样。
# database URL 形式是 sqlite://<nohostname>/<path>
engine = create_engine('sqlite:///foo.db')
# 在Unix/Mac
engine = create_engine('sqlite:////absolute/path/to/foo.db')
# 在Windows
engine = create_engine('sqlite:///C:\\path\\to\\foo.db')
# 在Windows 中使用原始字符串
engine = create_engine(r'sqlite:///C:\path\to\foo.db')
# 使用内存
engine = create_engine('sqlite://')
engine = create_engine('sqlite:///:memory:')
创建表
使用ORM,需要首先描述表,然后把类映射到表上。在SQLAclhemy中这两步通常在一起,使用叫做Declarative的系统,可以让我们创建一个包含描述我们需要创建表的类
创建declarative base class
需要先创建基类
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
创建类
比如创建User类,User类需要继承前面创建的Base。
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
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 系统不是必须的,比如:
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)
创建User表
Base.metadata.create_all(engine)
基本的CURD操作
需要创建一个session来对表进行操作
创建一个session
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
Session = sessionmaker()
'''or
Session = sessionmaker()
Session.configure(bind=engine)
'''
session = Session()
插入数据
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
一次添加多行
session.add_all([
User(name='wendy', fullname='Wendy Williams', password='foobar'),
User(name='mary', fullname='Mary Contrary', password='xxg527'),
User(name='fred', fullname='Fred Flinstone', password='blah')])
此时数据是没有插入到数据库中的,ed_user.id 是为None的。如果想真正插入数据库中需要commit。
session.commit()
如果想要操作只是在内存中,不真正commit,ed_user.id 不为None,可以使用flush操作,它只是写到内存中。
session.flush()
回滚操作
当没有commit之前,可以回滚
session.rollback()
读取操作,Querying
执行query操作之前会自动执行flush。
query例子:
for instance in session.query(User).order_by(User.id):
print(instance.name, instance.fullname)
# 可以只取其中的某些字段
for name, fullname in session.query(User.name, User.fullname):
print(name, fullname)
for row in session.query(User, User.name).all():
print(row.User, row.name)
for row in session.query(User.name.label('name_label')).all():
print(row.name_label)
可以使用alias对表取别名,可以在表join本身时用。
from sqlalchemy.orm import aliased
user_alias = aliased(User, name='user_alias')
for row in session.query(user_alias, user_alias.name).all():
print(row.user_alias)
使用filter_by筛选
for name, in sesson.query(User.name).filter_by(fullname='Ed Jones'):
print(name)
也可以使用filter,它更加的灵活
for name, in sesson.query(User.name).filter(User.fullname=='Ed Jones'):
print(name)
#相等
query.filter(User.name == 'ed')
#不相等
query.filter(User.name != 'ed')
#like
query.filter(User.name.like('%ed%'))
#in
query.filter(User.name.in_(['ed', 'wendy', 'jack']))
query.filter(User.name.in_(
session.query(User.name).filter(User.name.like('%ed%'))
))
#not in
query.filter(~User.name.in_(['ed', 'wendy', 'jack']))
#IS NULL
query.filter(User.name == None)
query.filter(User.name.is_(None))
#IS NOT NUKK
query.filter(User.name != None)
query.filter(User.name.isnot(None))
#And
from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))
query.filter(User.name == 'ed', User.fullname == 'Ed Jones')
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')
#OR
from sqlalchemy import or_
query.filter(or_(User.name == 'ed', User.name == 'wendy'))
#Match
query.filter(User.name.match('wendy'))
返回列表
all() 操作,一次取出所有,返回一个列表。
query = session.query(User).filter(Usre.name.like('%ed%')).all()
first() 取出第一个,如果没有就返回None
obj = query.first()
one() 取出一个,如果筛选的结果不只一个,报MultipleResultsFound错,如果没有报NoResultFound 错
one_or_none() 取出一个,如果筛选的结果不只一个,报MultipleResultsFound错,如果没有返回None
scalar() 跟one_or_none() 一样
使用原始的sql
query = session.query(User).filter('id<200').order_by(text('id')).all()
使用参数
query = session.query.(User).filter(text('id<:value and name=:name')).params(value=224, name='fred').order_by(User.id).one()
使用完全基于string
query = session.query(User).from_statement(
text('SELECT * FROM users where name=:name').params(name='ed').all()
).all()
count
count = session.query(User).filter(User.name.like('%ed%')).count()
from sqlalchemy import func
query = session.query(func.count(User.name), User.name).group_by(User.name).all()
session.query(func.count('*')).select_from(User).scalar()
session.query(func.count(User.id)).scalar()
更新
user.name = 'haha'
session.commit()
删除
session.delete(user)
SQLAlchemy数据库连接和初始化数据库的更多相关文章
- 【笔记】python的sqlalchemy数据库连接池原理的说明
sqlalchemy数据库连接池的使用方式是延迟初始化,就是说一开始你调用create_engine(...)后创建的那个数据库池是空的,你后面通过session.connection()或者engi ...
- 利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题
问题的描述: 一个项目,涉及到了 两个数据源,分别使用的是 两个不同的 数据库连接池,其中一个是 poxool 连接池,问题在于,spring在启动时,只初始化其中的一个 数据库连接池中的数据库连接, ...
- Entity FrameWork初始化数据库的四种策略
程序猿就是苦逼,每天还得分出一些时间去写博文.天真的很热,今天就随便写一点啦! 1.EF初始化数据库的四中策略 EF可以根据项目中的模型自动创建数据库.下面我们就分类看看Entity Framewor ...
- SQLAlchemy通过models创建数据库表
原地址:http://blog.csdn.net/jmilk/article/details/53184903 定义数据模型 models SQLAlchemy 允许我们根据数据库的表结构来创建数据模 ...
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...
- C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...
- activiti搭建(一)初始化数据库
转载请注明源地址:http://www.cnblogs.com/lighten/p/5876681.html activiti-engine.jar包中自带了创建activiti工作流数据库表的SQL ...
- ASP.NET 5:初始化数据库
ASP.NET 5:初始化数据库 1.初始化数据库 1.2目录 这不是专述模式/架构设计的帖子,架构搭建以讲解文章为目的,先不过多分层. 截这个图也是便于你对应下面找代码文件路径! 1.2代码 先控制 ...
- 【EF6学习笔记】(一)Code First 方式生成数据库及初始化数据库实际操作
本篇参考原文地址: Creating an Entity Framework Data Model 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整 ...
随机推荐
- Eclipse 如何创建Web项目
Eclipse 如何创建Web项目 CreateTime--2018年3月8日16:43:33 Author:Marydon 第一步: 右键-->New-->Dynamic Web P ...
- Drupal administration theme
Drupal允许为管理后台设置独立的theme,保存在系统变量variable_get('admin_theme'). Drupal使用全局变量$theme来保存当前请求对应的主题.Drupal在启动 ...
- 通过配置CPU参数 worker_cpu_affinity 提升nginx性能
简介 Nginx默认没有开启利用多核cpu,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu的性能.cpu是任务处理,计算最关键的资源,cpu核越多,性能就越好. 规 ...
- 如何在Win8中设置虚拟热点共享上网(转)
摘自:http://www.enet.com.cn/article/2013/0408/A20130408273749.shtml 在Windows 7中,我们可以通过网络与共享中心的“设置新的连接和 ...
- Linux命令-防火墙命令:iptables
iptables详解--转 查看防火墙设置: 第一种方式: cat /etc/sysconfig/iptables 第二种方式: iptables -L -n -v 设置防火墙: 第一种方式: ipt ...
- jsp里面实现asp.net的Global文件内容。
Global.java文件: import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import ...
- 重写 View 的 Touch 方法,实现一个酷炫的九宫格图片
前几天翻看代码库,发现一个之前写过的一个有意思的小玩意,共享给大家
- Python hypot() 函数
描述 hypot() 返回欧几里德范数 sqrt(x*x + y*y). 语法 以下是 hypot() 方法的语法: import math math.hypot(x, y) 注意:hypot()是不 ...
- 【转载】BasicDataSource配置说明
commons DBCP 配置参数简要说明 在配置时,主要难以理解的主要有:removeAbandoned .logAbandoned.removeAbandonedTimeout.maxWait这四 ...
- python标准库介绍——17 tempfile 模块详解
==tempfile 模块== [Example 2-6 #eg-2-6] 中展示的 ``tempfile`` 模块允许你快速地创建名称唯一的临时文件供使用. ====Example 2-6. 使用 ...