原始 SQL
在 SQLite 教程的这一部分中,我们使用原始 SQL。 SQLAlchemy 并不是纯粹的 ORM 工具包。 它还允许在需要时执行原始 SQL 语句。
标量数据
在第一个示例中,我们连接到内存中的 SQLite 数据库并执行一个简单的 SQL 语句。
scalar_data.py
#!/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
方法创建一个引擎,该引擎用于将 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 数据库并打印其版本。
postgres_version.py
#!/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',)
这是一个示例输出。
创建数据库表
在下面的示例中,我们将创建一个表并将其填充数据。
raw_create_table.py
#!/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
表的列名。
raw_column_names.py
#!/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 语句。