sqlalchemy 初步认识

1. 前言

1.1 ORM 模型

亦即对象关系映射, ie, 将关系数据库中的业务数据用对象的形式表示出来, 并通过面向对象的方式将这些对象组织起来, 最终在应用程序中创建一个“虚拟对象数据库”

1.2 SQLAlchemy 架构

稳定, 高性能
这里写图片描述

1.3 说明

这里仅对 ORM层的操作做一些记录, core层未涉及

2. 基本操作

2.1 创建数据库引擎

用下面这段代码可以创建一个 sqlite 的数据库, ps: python 内置的就是 sqlite 数据库

engine = create_engine('sqlite:///foo.db', echo=True)

echo = True 表示 显示相应执行的 sql 指令

2.2 建立表

  1. 从 Base 类 派生一个对象类, 这个类与所需要创建的数据库的表格相关, tablename 表征表的名字, 其他 id, name, fullname, password 为表的字段

  2. 通过 Base.metadata.create_all(engine) 来创建所有 Base 派生类所对应的数据表

Base = declarative_base()
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)

# 建立表
Base.metadata.create_all(engine)

2.3 操作数据库

主要通过Session 会话完成:
借助 query, filter_by, first, add_all 等指令来辅助实现

session.add(ed_user)
our_user = session.query(User).filter_by(name = 'ed').first()
# select * from users where name = 'ed' limit 1;

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")
])
session.commit()

print(session.query(User).all())

for row in session.query(User).filter(User.name.in_(['ed', 'wendy', 'jack'])):
    print(row)

for row in session.query(User).filter(~User.name.in_(['ed', 'wendy', 'jack'])):
    print(row)

print(session.query(User).filter(User.name == 'ed').count())

2.4 外键操作

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship, backref

# 建立一个带外键的表
class Address(Base):
    __tablename__ = "addresses"
    id = Column(Integer, primary_key=True)
    email_address = Column(Integer, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", backref=backref("addresses", order_by=id))

    def __repr__(self):
        return "<Address(email_address='%s')>" % self.email_address

# 建立表, 并向表中插入数据
Base.metadata.create_all(engine)
jack = User(name='jack', fullname='Jack Bean', password='gjffdd')
jack.addresses = [
    Address(email_address='jack@google.com'),
    Address(email_address='j24@yahoo.com')
]
session.add(jack)
session.commit()

# 联合查询
for u, a in session.query(User, Address).filter(User.id==Address.user_id).\
    filter(Address.email_address=="jack@google.com").all():
    print u, a

2.5 完整代码段

# -*- coding=utf-8 -*-

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

print(sqlalchemy.__version__)

engine = create_engine('sqlite:///foo.db', echo=True)

Base = declarative_base()

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)

# 建立表
#Base.metadata.create_all(engine)
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
print(ed_user)

Session = sessionmaker(bind=engine)
session = Session()

# session.add(ed_user)
# our_user = session.query(User).filter_by(name = 'ed').first()
# # select * from users where name = 'ed' limit 1;
#
# 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")
# ])
# session.commit()

# print(session.query(User).all())
#
# for row in session.query(User).filter(User.name.in_(['ed', 'wendy', 'jack'])):
#     print(row)
#
# for row in session.query(User).filter(~User.name.in_(['ed', 'wendy', 'jack'])):
#     print(row)
#
# print(session.query(User).filter(User.name == 'ed').count())


from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship, backref

class Address(Base):
    __tablename__ = "addresses"
    id = Column(Integer, primary_key=True)
    email_address = Column(Integer, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", backref=backref("addresses", order_by=id))

    def __repr__(self):
        return "<Address(email_address='%s')>" % self.email_address

#Base.metadata.create_all(engine)
jack = User(name='jack', fullname='Jack Bean', password='gjffdd')
jack.addresses = [
    Address(email_address='jack@google.com'),
    Address(email_address='j24@yahoo.com')
]
session.add(jack)
session.commit()

for u, a in session.query(User, Address).filter(User.id==Address.user_id).\
    filter(Address.email_address=="jack@google.com").all():
    print u, a

3. 使用过程中的一些小问题

3.1 pycharm 无法打开 foo.db 文件

这个原因主要是, 驱动没有安装,
这里写图片描述
在上述界面中点击 download 安装所需驱动即可

3.2 数据库连接语法

可以查看这个链接:
http://docs.sqlalchemy.org/en/rel_1_0/core/engines.html#database-urls

3.3 cannot import name create_engine

这里写图片描述
这里的主要原因是我们把文件名命名的和 模块名字重复了, 导致模块 sqlchemy 没有被正确的引入进来

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值