原始 SQL
最后修改于 2020 年 7 月 6 日
在本 SQLite 教程中,我们使用原始 SQL。 SQLAlchemy 不是一个纯粹的 ORM 工具包。它也允许在需要时执行原始 SQL 语句。
标量数据
在第一个示例中,我们连接到内存中的 SQLite 数据库并执行一个简单的 SQL 语句。
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import create_engine eng = create_engine('sqlite:///:memory:') with eng.connect() as con: rs = con.execute('SELECT 5') data = rs.fetchone()[0] print "Data: %s" % data
该示例打印由 SELECT
语句返回的值。
eng = create_engine('sqlite:///:memory:')
create_engine
方法创建一个 Engine,用于将 SQL 语句传递给数据库。该方法将连接字符串作为参数。我们将连接到内存中的 SQLite 数据库。
with eng.connect() as con:
使用 connect
方法,我们连接到连接字符串中指定的数据库。
rs = con.execute('SELECT 5')
使用连接的 execute
方法,我们传递一个简单的 SELECT SQL 语句。
data = rs.fetchone()[0]
使用 fetchone
方法,我们检索一行。从该行中,我们获取标量值。
print "Data: %s" % data
该值被打印到控制台。
$ ./scalar_data.py Data: 5
我们执行该脚本。
PostgreSQL 版本
在下一个示例中,我们连接到 PostgreSQL 数据库并打印其版本。
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import create_engine eng = create_engine('postgresql:///testdb') con = eng.connect() rs = con.execute("SELECT VERSION()") print rs.fetchone() con.close()
要选择数据库的版本,我们使用 SELECT VERSION
SQL 命令。
eng = create_engine('postgresql:///testdb')
我们连接到 PostgreSQL 中的 testdb
数据库。我们没有在连接字符串中包含用户名和密码。这是因为 PostgreSQL 允许在其信任身份验证策略中在本地连接上进行无需身份验证的连接。
rs = con.execute("SELECT VERSION()") print rs.fetchone()
我们执行 SQL 命令并将返回的数据打印到控制台。
$ ./postgres_version.py (u'PostgreSQL 9.3.9 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4, 64-bit',)
这是一个示例输出。
创建数据库表
在下一个示例中,我们将创建一个表并用数据填充它。
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import create_engine from sqlalchemy.sql import text eng = create_engine("mysql://testuser:test623@localhost/testdb") with eng.connect() as con: con.execute(text('DROP TABLE IF EXISTS Cars')) con.execute(text('''CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER)''')) data = ( { "Id": 1, "Name": "Audi", "Price": 52642 }, { "Id": 2, "Name": "Mercedes", "Price": 57127 }, { "Id": 3, "Name": "Skoda", "Price": 9000 }, { "Id": 4, "Name": "Volvo", "Price": 29000 }, { "Id": 5, "Name": "Bentley", "Price": 350000 }, { "Id": 6, "Name": "Citroen", "Price": 21000 }, { "Id": 7, "Name": "Hummer", "Price": 41400 }, { "Id": 8, "Name": "Volkswagen", "Price": 21600 } ) for line in data: con.execute(text("""INSERT INTO Cars(Id, Name, Price) VALUES(:Id, :Name, :Price)"""), **line)
使用后端中立的方式绑定参数来创建 Cars 表。
eng = create_engine("mysql://testuser:test623@localhost/testdb")
我们将连接到 MySQL 数据库。我们使用特定的 MySQL 连接字符串。
for line in data: con.execute(text("""INSERT INTO Cars(Id, Name, Price) VALUES(:Id, :Name, :Price)"""), **line)
使用 for 循环,我们将数据插入到数据库表中。数据库使用不同的绑定参数结构。使用 text
函数,我们使用后端中立的方式绑定参数。
$ mysql -u testuser -p mysql> USE testdb; mysql> SELECT * FROM Cars; +----+------------+--------+ | Id | Name | Price | +----+------------+--------+ | 1 | Audi | 52642 | | 2 | Mercedes | 57127 | | 3 | Skoda | 9000 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+ 8 rows in set (0.00 sec)
我们验证数据。
列名
以下示例打印 Cars
表的列名。
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import create_engine from sqlalchemy.sql import text eng = create_engine('sqlite:///:memory:') with eng.connect() as con: con.execute(text('''CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INTEGER)''')) rs = con.execute(text('SELECT * FROM Cars')) print rs.keys()
该示例在内存中创建一个数据库表并打印其列名。
rs = con.execute(text('SELECT * FROM Cars'))
在 SELECT
语句中,我们选择所有列。
print rs.keys()
keys
方法返回列的名称。
$ ./raw_column_names.py [u'Id', u'Name', u'Price']
这是示例的输出。
在本 SQLite 教程中,我们使用 SQLAlchemy 执行了原始 SQL 语句。