阿里云服务器ECS    
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新 [咨询更多]
阿里云存储OSS
简单易用、多重冗余、数据备份高可靠、多层次安全防护安全性更强、低成本 [咨询更多]
阿里云数据库RDS
稳定可靠、可弹性伸缩、更拥有容灾、备份、恢复、监控、迁移等方面的全套解决方案 [咨询更多]
阿里云安全产品
DDoS高防IP、web应用防火墙、安骑士、sll证书、态势感知众多阿里云安全产品热销中 [咨询更多]
阿里云折扣优惠    
云服务器ECS、数据库、负载均衡等产品新购、续费、升级联系客服获取更多专属折扣 [咨询更多]
如何插入数据
2020-9-2    点击量:

插入数据

首先,创建一条 insert 语句,用来把我最喜欢的 cookie(chocolate chip)放入 cookies 表中。为此,先调用 cookies 表的 insert() 方法,然后再使用 values() 语句,关键字参数为各个列及相应的值,如示例 2-1 所示。

示例 2-1 插入数据

ins = cookies.insert().values(
    cookie_name="chocolate chip",
    cookie_recipe_url="http://some.aweso.me/cookie/recipe.html",
    cookie_sku="CC01",
    quantity="12",
    unit_cost="0.50"
)
print(str(ins))

在示例 2-1 中,print(str(ins)) 语句向我们展示了实际要执行的 SQL 语句:

INSERT INTO cookies
    (cookie_name, cookie_recipe_url, cookie_sku, quantity, unit_cost)
VALUES
    (:cookie_name, :cookie_recipe_url, :cookie_sku, :quantity, :unit_cost)

在这个 SQL 语句中,我们提供的值被替换为 :column_name,这就是 SQLAlchemy 通过 str() 函数表示参数的方式。参数用来帮助确保数据被正确转义,从而减少 SQL 注入攻击等安全问题。仍然可以通过查看编译后的插入语句来查看参数,因为每个数据库后端处理参数的方式略有不同(这是由方言控制的)。ins 对象的 compile() 方法返回一个 SQLCompiler 对象,该对象允许我们通过 params 属性访问随查询一起发送的实际参数。

ins.compile().params

这将通过方言编译语句,但不会执行语句,并且我们要访问该语句的 params 属性。

结果如下:

{
    'cookie_name': 'chocolate chip',
    'cookie_recipe_url': 'http://some.aweso.me/cookie/recipe.html',
    'cookie_sku': 'CC01',
    'quantity': '12',
    'unit_cost': '0.50'
}

现在,我们已经完全了解了插入语句,并且知道了要插入到表中的内容。接下来可以使用 connection 的 execute() 方法把语句发送到数据库,数据库将把记录插入到表中(见示例 2-2)。

示例 2-2 执行插入语句

result = connection.execute(ins)

还可以通过访问 inserted_primary_key 属性获得刚才插入的记录的 ID:

result.inserted_primary_key
[1]

让我们快速了解一下调用 execute() 方法时会发生什么。当构建 SQL 表达式语言语句时,比如我们一直在用的插入语句,实际创建的是一个树状结构,这种结构可以采用自上而下的方式快速遍历。当调用 execute 方法时,它会使用传入的语句和其他参数,通过适当的数据库方言的编译器编译语句。编译器通过遍历树状结构构建一个普通的参数化 SQL 语句,而后该语句被返回给 execute 方法,execute 方法再通过调用该方法的连接把 SQL 语句发送到数据库,然后数据库服务器执行语句并返回操作结果。

insert 除了用作 Table 对象的实例方法外,还可以作为独立函数,在你想要逐步构建语句(每次一步)或者在表最初未知时使用。例如,我们公司可能有两个独立的部门,每个部门都有自己单独的库存表。使用示例 2-3 中的 insert 函数,我们就可以使用一条语句替换表。

示例 2-3 插入函数

from sqlalchemy import insert
ins = insert(cookies).values( 
    cookie_name="chocolate chip",
    cookie_recipe_url="http://some.aweso.me/cookie/recipe.html",
    cookie_sku="CC01",
    quantity="12",
    unit_cost="0.50"
)

➊ 请注意,cookies 表现在用作 insert 函数的参数。

 不管是作为 Table 对象的方法,还是作为一种更具生成性的独立函数,insert 都工作得很好,但我更喜欢后一种用法,因为它更接近于人们常见的 SQL 语句。

连接对象的 execute 方法不仅可以接受语句,还可以在语句之后接受关键字参数值。在编译语句时,它会向列列表添加每个关键字参数键,并将它们的每个值添加到 SQL 语句的 VALUES 部分(见示例 2-4)。

示例 2-4 执行语句中的值

ins = cookies.insert()
result = connection.execute(
    ins, 
    cookie_name='dark chocolate chip', 
    cookie_recipe_url='http://some.aweso.me/cookie/recipe_dark.html',
    cookie_sku='CC02',
    quantity='1',
    unit_cost='0.75'
)
result.inserted_primary_key

❶ 插入语句是 execute 函数的第一个参数,这和前面一样。

❷ 我们以关键字参数的形式把值添加到 execute 函数。

结果如下:

[2]

虽然这在实际工作中并不常用,但它确实很好地说明了语句在发送到数据库服务器之前是如何编译和组装的。可以通过使用一个字典列表一次插入多条记录,字典里面包含我们要提交的数据。下面使用这种方法把两种 cookie 插入到 cookies 表中(见示例 2-5)。

示例 2-5 插入多条记录

inventory_list = [ 
    {
        'cookie_name': 'peanut butter',
        'cookie_recipe_url': 'http://some.aweso.me/cookie/peanut.html',
        'cookie_sku': 'PB01',
        'quantity': '24',
        'unit_cost': '0.25'
    },
    {
        'cookie_name': 'oatmeal raisin',
        'cookie_recipe_url': 'http://some.okay.me/cookie/raisin.html',
        'cookie_sku': 'EWW01',
        'quantity': '100',
        'unit_cost': '1.00'
    }
]
result = connection.execute(ins, inventory_list) 

❶ 创建 cookie 列表。

❷ 把列表作为 execute 函数的第二个参数。

 列表中的字典必须拥有完全相同的键。SQLAlchemy 会根据列表中的第一个字典编译语句,如果后续字典不同,则该语句会失败,因为该语句已经与前面的列一起构建了。

联系客服免费领取更多阿里云产品新购、续费升级折扣,叠加官网活动折上折更优惠