插入数据
要往表里插数据,先创建一个 insert 对象
ins = user_table.insert()
打印这个 insert 对象,可以看到它所对应的 SQL 语句:
>>> print(ins )
INSERT INTO user (id, name, fullname) VALUES (?, ?, ?)
如果 MetaData 创建时没有绑定引擎,那么输出会略有不同:
INSERT INTO "user" (id, name, fullname) VALUES (:id, :name, :fullname)
现在我们添加上要写入的数据
ins = ins.values(name='xiaoming', fullname='Li XiaoMing')
打印下:
>>> print(ins )
INSERT INTO user (name, fullname) VALUES (?, ?)
现在 id
字段已经没有了。
执行语句
我们一直在说的引擎,可以理解成一个数据库连接对象的仓库,通过连接对象可以往数据库发送具体的 SQL 语句。调用引擎的 connect()
方法可以获取一个连接:
conn = engine.connect()
现在把前面的Insert对象丢给它来执行:
result = conn.execute(ins)
执行完后数据就写入相关的表中了。
下面是一个完整的例子:
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Table, Column, Date, Integer, String, ForeignKey
# 连接数据库
engine = create_engine('sqlite:///school.db', echo=False)
# 绑定引擎
metadata = MetaData(engine)
# 连接数据表
user_table = Table('user', metadata, autoload=True)
address_table = Table('address', metadata, autoload=True)
# 创建 insert 对象
ins = user_table.insert()
# 绑定要插入的数据
ins = ins.values(name='xiaoming', fullname='Li XiaoMing')
# 连接引擎
conn = engine.connect()
# 执行语句
result = conn.execute(ins)
执行多条语句
SQLalchemy 允许我们把参数通过 execute()
方法传进去:
ins = user_table.insert()
conn.execute(ins, name='xiaoming', fullname='Li XiaoMing')
完整例子:
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Table, Column, Date, Integer, String, ForeignKey
# 连接数据库
engine = create_engine('sqlite:///school.db', echo=False)
# 绑定引擎
metadata = MetaData(engine)
# 连接数据表
user_table = Table('user', metadata, autoload=True)
address_table = Table('address', metadata, autoload=True)
# 连接引擎
conn = engine.connect()
# 创建 insert 对象
ins = user_table.insert()
# 传递参数并执行语句
conn.execute(ins, name='xiaoming', fullname='Li XiaoMing')
一次插入多条记录也很简单,只要传一个字典列表(每个字典的键必须一致)给execute()即可:
conn.execute(address_table.insert(), [
{ 'user_id': 1, 'email': 'sprinfall@gmail.com' },
{ 'user_id': 1, 'email': 'sprinfall@hotmail.com' },
])
完整例子:
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Table, Column, Date, Integer, String, ForeignKey
# 连接数据库
engine = create_engine('sqlite:///school.db', echo=False)
# 绑定引擎
metadata = MetaData(engine)
# 连接数据表
user_table = Table('user', metadata, autoload=True)
address_table = Table('address', metadata, autoload=True)
# 连接引擎
conn = engine.connect()
# 执行多条语句
conn.execute(address_table.insert(), [
{ 'user_id': 1, 'email': 'sprinfall@gmail.com' },
{ 'user_id': 1, 'email': 'sprinfall@hotmail.com' },
])