首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不用ORM,实现在Python中直写SQL

现代的编程语言在进行数据库操作时候,往往都是使用ORM组件(Object Relational Mapping)而不是直接链接到数据库中然后自己写SQL,ORM可以帮我们厘清数据关系、自动进行内置的Sql注入防护等等,总之好处多多。但是往往有点不太自由束手束脚不太放得开。

在早期的PHP写Web应用时候基本都是自己拼Sql语句的,当然带来大量的注入式漏洞。时下在Golang语言中,其语言内置了数据库的Sql包,可以让用户直接通过非ORM、非查询构建器方法来与数据库交互。即使在一些Golang大型项目中,写Sql语句也是很常见的。

而现在最流行,用户量最大的Python语言中没有任何内置的支持数据库交互的东西,这也给初学者进行数据库操作增加麻烦。本文中虫虫就给大家介绍如何在Python中通过适配器直接编写Sql语句,从而达到间接学习数据库和Sql语言的目的。

本文主要目的在于学习,可以实现在Python中不依赖查询生成器和ORM熟练的拼写和处理Sql,并能将这些逻辑抽象打包,最后可以实现MVC三层架构,实现数据库操作和业务逻辑(以及表现层)分开。

从一个简单的例子开始:

User是可能看到的名为SQL表的字面定义user。 这包括喜欢包含在所有SQL表中的一些列:

id(主键)。

dt_created日期时间值,通常默认为NOW()。

所有字段默认为None,这可以姐可以执行SELECT不包含表中所有列的查询,同时仍然能够将行转换为User对象。所有列都是NOT NULL除了mobile,代码中利用Optional键入提示以强调该字段允许NULL。

创建数据库

现在可以创建的存储库,创建的存储库是一个抽象类,可以确保任何未来的实现都需要遵循规则。

为了方便,我们直接使用psycopg3来实现PostgreSQL链接,其他数据库类型都可以随时扩展:

首先,根据配置设置连接,连接到数据。

结果会返回psycopg游标的函数。psycopg3包含一个自定义行工厂,这个功能非常有用。

你会注意到new()使用基本光标,但是get_by_id()游标使用带有类行工厂的 ,这这样返回的行将是类型User对象。

new_user_repo()在假设的业务逻辑中使用的函数:

new_user_repo()可以修改为返回任何实现UserRepository,可以是PostgreSQL,也可能是MySQL实现,或者SQLite实现,甚至可能是用于测试目的的模拟数据库。

总结

在编程届各种技术层出不穷,迭代替换,唯一常青树不变的,SQL是一个。编写Sql可以让我们更加轻松自由和数据库打交道,当然对于初学者更是莫大的宝藏,与其看看几个月就会被淘汰的ORM复杂语法框架,不如直接深入纯的Sql层。当然直接写Sql一直有风险,尤其是线上系统,请谨慎使用。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O6KsLhcqr5GPhAyH1vf6Nsyg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券