SQLAlchemy不负责指南

2015-11-03 07:32:21

本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循署名-非商业用途-保持一致的创作共用协议

本文为SQLAlchemy的官方文档的翻译,因为无论你做什么,多少都会接触数据库,那么SQL型数据库将是你的一个非常好的选择,但是直接使用SQL语句,将可能造成很多不必要的问题,这时候ORM(Object Relational Mapper)便横空出世了,通过简单的包装,你便可以使用诸如 python,ruby,php之类的编程语言操控SQL型数据库,其中,SQLAlchemy是python众多ORM中的翘楚,本文翻译自他的官方文档 http://docs.sqlalchemy.org/en/rel10/orm/tutorial.html


检测版本

一个快速的检测我们使用的SQLAlchemy是不是 1.0版本的

>>> import sqlalchemy
>>> sqlalchemy.__version__ 
1.0.0

链接数据库

对这个教程,我们将使用 内存读取数据库(in-memory-only) SQLite数据库,对于连接数据库我们使用 create_engine():

>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)

echo方法是用来建立 SQLAlchemy的日志(即是程序的日记)的,使用的是 python 的 标准库 logging,使用这个的话,我们就可以看到标准SQL语句的产出,如果你正在看这个教程,希望少一点日志输出的话的话,将 echo 设为 False

create_engine()函数返回的是一个 Engine的实例,这也可以理解为一个数据库的操作台,可以更好的操控使用数据库的 DBAPI,这里 SQLite数据库将会被表示为 python内置的 sqlite3模块

当第一次使用诸如 Engine.excute()或是 Engine.connect()命令时, Engine将会使用真的 DBAPI去连接数据库,即是使用 SQL语句去操控数据库


声明一个映射

当我们使用ORM时,标准过程开始于我们要使用一个表来让我们调用,然后我们定义这些类来映射我们需呀的表,在现在的 SQLAlchemy,这两个操作我们一般一起做,当使用 Declarative时,将会是我们创建一个类去创建我们需要的映射表

映射类用的是 Declarative系统,定义为一堆基本的 base 去操作 declarative base class我们的应用将会用 declarative_base()的功能来使用一个这样的实例,:

>>> from sqlalchemy.ext.declarative import declarative_base

>>> Base = declarative_base()

现在我们有一个实例 base了,我们可以定义一堆映射类,我们将会从一个 User表的定义开始,所以我们必须定义他的相关细节,他的表名,他的数据类型,他的行:

>>> 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__来定义表名属性,和至少一行的数据定义,SQLAlchemy 从来不假设假设你的数据名,数据类型等等:

当我们的类建好了,要定义好我们的行(Column),其实我更喜欢翻译他为元素,要做好他的数据类型,因为这些都会作为SQL语句打出来


建立一个表

用我们刚刚已经做好的 User来做我们的表系统,我们有一个特别的对象 Table调用,可以查看我们已经定义了的表:

>>> User.__table__ 
Table('users', MetaData(bind=None),
           Column('id', Integer(), table=<users>, primary_key=True, nullable=False),
           Column('name', String(), table=<users>),
           Column('fullname', String(), table=<users>),
           Column('password', String(), table=<users>), schema=None)

当我们定义好我们的类后, Declarative用python的元类去创建表 (Table),也是一个 映射对象 (Mapper Object)

这个 Table对象是一个 MetaData的更大的集合(包含我们刚刚创建的 User),我们可以使用 MetaData.create_all()来创建我们定义了的表

他会自动运行 CREATE TABLE的SQL语句:

>>> Base.metadata.create_all(engine) 
PRAGMA table_info("users")
()
CREATE TABLE users (
    id INTEGER NOT NULL,
    name VARCHAR,
   fullname VARCHAR,
  password VARCHAR,
  PRIMARY KEY (id)
)
()
COMMIT

这样我们就的到了我们要的表啦~~~


创建映射类实例

我们现在只是拥有了我们的表,但是如果不能调用就是无用的了。

我们可以使用 User对象来操作我们的表:

>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'

甚至我们不需要建,当我们连接的时候id仍会变成 NONE值,

(最近因为考试原因,他日继续填坑)

数据库 返回首页

Designed and built with all the love in the world by the Mr.ALJUN.

@SERVER BY NGINX AND POWER BY DIGITALOCEAN.

© COPYRIGHT BY GAGASALAMER 2015