# -*- coding: utf-8 -*-
"""
Created on Wed Aug 15 13:59:37 2018
sqlalchemy 学习
本例中采用内存中的sql-lite数据库
@author: Administrator
"""
#建立引擎
engine = create_engine('sqlite:///:memory:',echo=True)
"""
echo 是设置日志记录的开关,通过标准模块logging
启用后我们将看到所有生成的sql
create_engin()的值返回一个引擎实例,他代表了数据库的核心接口,
sqllite语言将通过python内置的sqlite3模块指令执行
创建实例后 ,并没有真的连接到了数据库,而是在第一次运行时,才连接
这种办法叫做lazy connencting
"""
#描述映射
"""
当我们使用orm时,配置过程首先描述我们将要处理的数据库表,然后定义
我们自己的类,这些类将映射到这些表,在现在的sqlalchemy中,这两个任务
通常使用成为declare active的系统一起执行,这允许我们创建包含指令的类,
以描述他们将映射到的实际数据库表。
"""
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_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)
"""
使用declareative 的类至少需要__tablename__属性,并且至少有一个column是主键的一部分
sqlalchemy从不对所引用的类做出任何假设,包括它没有名称,数据类型,约束的内置约定
但这并不意味着需要样板,相反,我们鼓励您使用辅助函数和mixin类创建自己的自动约定
除了映射作用外,我们可以和普通类一样定义该类的方法
"""
#创建架构(create Schema)
"""
当我们声明我们的类时,Declarative使用Python元类,
以便在类声明完成后执行其他活动;在此阶段,
它根据我们的规范创建了一个Table对象,
并通过构造Mapper对象将其与类相关联。
这个对象是我们通常不需要直接处理的幕后对象
(尽管它可以在我们需要时提供有关我们的映射的大量信息)。
Table对象是一个名为MetaData的较大集合的成员。
使用Declarative时,可以使用声明性基类的.metadata属性来使用此对象。
MetaData是一个注册表,
包括向数据库发出一组有限的模式生成命令的功能。
由于我们的SQLite数据库实际上没有用户表,
我们可以使用MetaData为所有尚不存在的表向数据库发出CREATE TABLE语句。
下面,我们调用MetaData.create_all()方法,将我们的Engine作为数据库连接源传递。
我们将看到首先发出特殊命令以检查users表是否存在,然后是实际的CREATE TABLE语句:
"""
Base.metadata.create_all(engine)
"""
熟悉CREATE TABLE语法的用户可能会注意到VARCHAR列的生成没有长度;在SQLite和PostgreSQL上,
这是一种有效的数据类型,
但在其他情况下,它是不允许的。
因此,如果在其中一个数据库上运行本教程,并且您希望使用SQLAlchemy发出CREATE TABLE,
则可以向String类型提供“length”,如下所示:
"""
Column(String(50))
"""
除了创建表之外,SQLAlchemy不会引用String上的length字段以及Integer,
Numeric等上可用的类似精度/比例字段。
此外,Firebird和Oracle需要序列来生成新的主键标识符,
而SQLAlchemy不会在未经指示的情况下生成或假设这些标识符。
为此,您使用Sequence构造:
"""
from sqlalchemy import Sequence
Column(Integer, Sequence('user_id_seq'), primary_key=True)
"""
因此我们生成表格最简洁的办法如下
"""
class User(Base):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
password = Column(String(12))
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
self.name, self.fullname, self.password)
#创建映射类的实例
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
ed_user.name
ed_user.password
str(ed_user.id)
#创建会话 create a Session
from sqlalchemy.orm import sessionmaker
Session = sessionmaker()
session = Session()