sql 它是管理数据库最常用的编程语言,由于其稳定性和简单性,在许多大公司中使用。但是如果我们想把它集成到一个更大、更通用的程序中呢?这就是对象关系管理器起作用的地方!在这篇文章中,我将讨论和展示一些使用 sqlite3 与 sql 数据库通信的基本知识示例。在专业环境中,大部分工作将通过 sqalchemy 等标准化 orm 完成,但了解幕后发生的事情是有好处的。
在我们开始与数据库对话之前,我们需要 sqlite3 导入我们的 python 文件中。
import sqlite3
导入后,我们设置了与数据库的连接和与之互动的游标。这并不意味着如果您尝试连接的文件不存在,此行将在连接前创建。
conn = sqlite3.connect('pets.db') cursor = conn.cursor()
为了在 python 在跟踪数据库信息时,我们将创建一个与数据库表中包含的信息相对应的类别。对于我们的例子,我们将为用户创建一个宠物数据库。
class pet: all = {} def __init__(self, name, species, id=none): self.id = id self.name = name self.species = species
在这个例子中,id、name 和species 它是表中的列,这一类的每一个例子都是一行。我们将使用字典属性 all 存储数据库中的每个例子,这样我们就不必每次引用它们时都从数据库中提取它们。我们将初始化 id 保留为 none,因为它将在我们为对象创建实际数据库条目后进行分配。
现在我们的框架开始组合在一起,让我们通过我们的类操作看到一些东西 sql 构建和操作数据库的代码示例。在我们做任何事情之前,我们需要创建一个表。语法和 sql 它本身几乎是一样的,但作为一个特殊的字符串传递给我们 cursor 在我们的数据库上运行。
@classmethod def create_table(cls): sql = """ create table if not exists pets ( id integer primary key, name text, species text) """ cursor.execute(sql) conn.commit()
接下来,我们需要能够将信息添加到我们的数据库中。毕竟,没有信息可组织的数据库表是什么?我们将使用类别方法“create“创建实例,使用实例法”save将自己保存到数据库和类别中。
@classmethod def create(cls, name, species): pet = cls(name, species) pet.save() return pet def save(self): sql = """ insert into pets (name, species) values (?, ?) """ cursor.execute(sql, (self.name, self.species)) conn.commit() self.id = cursor.lastrowid type(self).all[self.id] = self
请注意,我们写的是“?“符号不是我们想要的 sql 代码中使用的实际值。 cursor.execute 函数可以识别这些,并用我们传递给它的值代替它们。在这种情况下,为 self.name 和 self.species。然后我们从数据库中获得新的插入行 id,并将其用作实例 python 字典的键。
现在我们已经掌握了为数据库创建信息的基本知识,我们可以写一个简短的测试脚本来演示。
from pet import pet def seed_database(): pet.create_table() fido = pet.create("fido", "dog") print(fido) seed_database()
会在控制台打印什么?
<pet.pet object at></pet.pet>
我们至少要创建一个对象,让我们更新 pet 我们可以使用特殊函数来覆盖基本的打印功能 'repr' 做到这一点。
def __repr__(self): return f"<pet>" </pet>
该函数获取类的例子,并返回格式化字符串,以轻松显示我们的信息。
<pet fido dog></pet>
这表明它正在工作,但只使用 python 对象没有什么是不可能的。数据库的明显优点是它被保存在一个单独的文件中,因此您的数据在程序执行之间保持不变。让我们把它分成一个简单的脚本来播种数据库,以及一个打印出来进行演示的脚本。当我们这样做时,我们会去 pet 类别添加更多功能。
import sqlite3 conn = sqlite3.connect('database.db') cursor = conn.cursor() class pet: # dictionary of objects saved to the database. all = {} def __init__(self, name, species, id=none): self.id = id self.name = name self.species = species def __repr__(self): return f"<pet>" @classmethod def create_table(cls): """ create a new table to persist the attributes of animal instances """ sql = """ create table if not exists pets ( id integer primary key, name text, species text) """ cursor.execute(sql) conn.commit() @classmethod def drop_table(cls): sql = """ drop table if exists pets; """ cursor.execute(sql) conn.commit() @classmethod def create(cls, name, species): """ initialize a new pet instance and save the object to the database """ pet = cls(name, species) pet.save() return pet def save(self): sql = """ insert into pets (name, species) values (?, ?) """ cursor.execute(sql, (self.name, self.species)) conn.commit() self.id = cursor.lastrowid type(self).all[self.id] = self def update(self): sql = """ update pets set name = ?, location = ?, location = ? where id = ? """ cursor.execute(sql, (self.name, self.location, self.id)) conn.commit() def delete(self): sql = """ delete from pets where id = ? """ cursor.execute(sql, (self.id,)) conn.commit() # delete the dictionary entry using id as the key del type(self).all[self.id] # set the id to none self.id = none @classmethod def get_all(cls): sql = """ select * from pets """ rows = cursor.execute(sql).fetchall() return [cls.instance_from_db(row) for row in rows] </pet>
种子脚本:
from pet import pet def seed_database(): pet.drop_table() pet.create_table() fido = pet.create("fido", "dog") lucy = pet.create("lucy", "turtle") borris = pet.create("borris", "goldfish") seed_database()
我们的最终测试脚本将向数据库添加一个条目并显示其内容。
from pet import pet def add_and_display(): pet.create("bob", "chicken") for pet in pet.get_all(): print(pet) add_and_display()
现在,如果我们想重置数据库并给它一些初始值,我们只需要操作:
$ python lib/seed.py
我们可以通过运行看到它的持续存在:
$ python lib/display.py
<pet fido dog><pet lucy turtle><pet borris goldfish><pet bob chicken></pet></pet></pet></pet>
每次操作显示脚本时,它都会在表中添加另一个 bob!
<pet fido dog><pet lucy turtle><pet borris goldfish><pet bob chicken><pet bob chicken></pet></pet></pet></pet></pet>
这远不是一个好的 orm 所有内容,但它是一个很好的框架,可以帮助你了解标准化对象关系管理器的底层。
以上就是建立 ORM 更多关于研讨会的细节,请关注其他相关文章!
WPS菜单栏恢复:解决灰色无法点击的困扰!
建立 ORM Python教程研讨会
高效办公秘诀:办公软件快捷键全集!
国产服务器厂商排名:领军者实力尽显(注意:此标题符合20字以内的要求,并且没有使用双引号)
远程桌面连接异常?快速修复,畅通无阻!
IDC:华为擎云商用平板出货量获得中国市场第一-IT行业
Ctrl+E失效?揭秘复制不起的真相!
IDC:华为擎云商用平板出货量获得中国市场第一-IT行业
q币可以充电话费-常见问题?
荣耀折叠机转轴新专利公布,解决阻尼不稳定、开合感差的问题——IT行业
宝马在7月份实施了降量保价策略,以应对价格战造成的严重损失——IT行业
世界上第一个,中国将主持铁路自动驾驶国际标准-IT行业的编制
第一个基于Mamba的MLLM来了!模型权重、培训代码等都已开源-人工智能
探索极限竞争性能,黑鲨外设新产品准备出发!-IT行业
夏普正在开发锌空气储能电池 2025 年启动验证试验-IT行业-IT行业
503代码错误-常见问题是什么?
错误代码10011是什么意思?常见问题
错误代码10018是什么意思?常见问题
wifi感叹号是怎么回事-常见问题