SQLAlchemy学习笔记(一)

前言:该笔记是本人学习SQLAlchemy官方文档整理得来。

查看SQLAlchemy版本

>>> import sqlalchemy
>>> sqlalchemy.__version__
'1.0.15'
>>>

连接数据库

本教程中我们将使用postgresql数据库,连接数据库我们使用create_engine():

>>> >>> from sqlalchemy import create_engine
>>> engine = create_engine('postgresql://ricky:passwd@localhost/my_db', echo=True)

关于SQLAlchemy连接不同的数据库的URL设置,请自行搜索。
echo参数是设置SQLAlchemy日志显示的快捷方式,这样我们在python命令行中执行的命令都会在下面显示出日志信息(这里我们能清楚看到只想的SQL语句详细内容)。如果我们不想看见执行的详细过程,可以将echo设置为False

create_engine()函数返回一个Engin的实例,代表着访问数据库的接口。

延迟连接

create_engine()第一次调用,它没有尝试去连接数据库,仅仅是当我们执行数据库操作时,才会去连接数据库。

定义映射

当我们在使用ORM的时候,数据库中的一张表对应着我们的一个类,我们使用declarative_base()创建一个基类。

>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()

现在我们有了一个基类Base,我们可以定义很多映射的类,先从一张完整的表格,名字为Users开始,一个新的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(naem=%s, fullname=%s, password=%s)>" % (self.name, self.fullname, self.password)
...

一个最简单的类需要一个__tablename__属性,和至少一行Column和一个外键primary key

Tip######

User类定义了一个__repr__()方法,但是这个是可选的,我们在这里定义是为了打印出类的对象的内容。

创建一个模型

通过声明系统,我们已经定义了我们表格的详细信息,我们可以通过__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)

当我们定义了我们的类,声明系统使用一个Python的metaclass来执行其他任务,一旦这个类声明完成。
表的对象是一个更大的称为元数据集合的一个成员。当我们使用这个系统,可以使用这个对象.metadata属性声明我们基类的属性。

MetaData是一个注册表,当我们的数据库不存在一个users表格,我们可以使用MetaData去创建一个不存在的表格,我们调用MetaData.create_all()方法,Engine作为一个数据库的连接。

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

在上面的声明一个表中的列时,我们注意到列的数据类型为字符串,但是没有指定长度;在SQLite和PostgreSQL中这样的声明是合法的,但是在其他的数据库中是不允许的。所以,如果运行这个教程在洽谈的数据库中,可能会报错。最好我很使用下面的声明方式。

Column(String(50))

另外在Firebird和Oracle数据库中要求sequences去生成一个新的外键约束。你可以使用序列来构造。

from sqlalchemy import Sequence
Column(Integer, Sequence('user_id_seq'), primary_key=True)

完整的Table的定义为:

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)

创建一个映射的类的对象

我们来创建一个User的对象.

>>> ed_user = User(name='ricky', fullname='yuziyong', password='123')
>>> ed_user.name
'ricky'
>>> ed_user.password
'123'
>>> ed_user.fullname
'yuziyong'
>>> str(ed_user.id)
'None'

尽管我们没有特别在构造函数指定,但是id属性仍然产生了一个值None,当我们访问它,SQLAlchemy的工具通常会产生一个默认值。

待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容