通过IPython访问RDBMS
项目描述
引入了%sql (或%%sql) 魔法。
使用SQLAlchemy URL 连接字符串连接到数据库,然后在IPython或IPython笔记本中执行SQL命令。
示例
In [1]: %load_ext sql
In [2]: %%sql postgresql://will:longliveliz@localhost/shakes
...: select * from character
...: where abbrev = 'ALICE'
...:
Out[2]: [(u'Alice', u'Alice', u'ALICE', u'a lady attending on Princess Katherine', 22)]
In [3]: result = _
In [4]: print(result)
charid charname abbrev description speechcount
=================================================================================
Alice Alice ALICE a lady attending on Princess Katherine 22
In [4]: result.keys
Out[5]: [u'charid', u'charname', u'abbrev', u'description', u'speechcount']
In [6]: result[0][0]
Out[6]: u'Alice'
In [7]: result[0].description
Out[7]: u'a lady attending on Princess Katherine'
第一次连接后,可以省略连接信息
In [8]: %sql select count(*) from work Out[8]: [(43L,)]
可以维护多个数据库的连接。你可以通过username@database引用现有的连接
In [9]: %%sql will@shakes
...: select charname, speechcount from character
...: where speechcount = (select max(speechcount)
...: from character);
...:
Out[9]: [(u'Poet', 733)]
In [10]: print(_)
charname speechcount
======================
Poet 733
如果没有提供连接字符串,%sql 将提供一个现有连接的列表;但是,如果没有建立任何连接,并且环境变量DATABASE_URL可用,则将使用该变量。
为了安全访问,你可以动态地访问你的凭证(例如从系统环境或getpass.getpass),以避免在笔记本本身中存储密码。在%sql命令中使用$来访问任何变量。
In [11]: user = os.getenv('SOME_USER')
....: password = os.getenv('SOME_PASSWORD')
....: connection_string = "postgresql://{user}:{password}@localhost/some_database".format(user=user, password=password)
....: %sql $connection_string
Out[11]: u'Connected: some_user@some_database'
你可以在单个单元中执行多个SQL语句,但你只会看到最后一个语句的查询结果,所以这实际上只适用于没有输出的语句
In [11]: %%sql sqlite://
....: CREATE TABLE writer (first_name, last_name, year_of_death);
....: INSERT INTO writer VALUES ('William', 'Shakespeare', 1616);
....: INSERT INTO writer VALUES ('Bertold', 'Brecht', 1956);
....:
Out[11]: []
作为便利,支持以字典样式访问结果集,其中最左边的列作为键,用于唯一值。
In [12]: result = %sql select * from work
43 rows affected.
In [13]: result['richard2']
Out[14]: (u'richard2', u'Richard II', u'History of Richard II', 1595, u'h', None, u'Moby', 22411, 628)
结果也可以作为字典迭代器(result.dicts())或带有每个键的标量值元组的单个字典(result.dict())检索。
变量替换
可以使用“命名”样式(:x)绑定变量(绑定参数)。所使用的变量名称应在本地命名空间中定义。
In [15]: name = 'Countess'
In [16]: %sql select description from character where charname = :name
Out[16]: [(u'mother to Bertram',)]
或者,可以使用$variable_name或{variable_name}在形成并传递给SQL引擎之前将本地命名空间中的变量注入SQL语句。(不支持同时使用$和{},如${variable_name}。)
In [17]: %sql select description from character where charname = ‘{name}’ Out[17]: [(u’mother to Bertram’,)]
绑定变量会传递到SQL引擎,并且只能用于替换传递给SQL的字符串。$和{}在传递给SQL之前会被替换,并可用于动态形成SQL语句。
赋值
普通的IPython赋值对单行%sql查询有效。
In [18]: works = %sql SELECT title, year FROM work
43 rows affected.
<<操作符将查询结果捕获到局部变量中,并可用于多行%%sql。
In [19]: %%sql works << SELECT title, year
...: FROM work
...:
43 rows affected.
Returning data to local variable works
连接
连接字符串是SQLAlchemy URL标准。
一些示例连接字符串
mysql+pymysql://scott:tiger@localhost/foo oracle://scott:tiger@127.0.0.1:1521/sidname sqlite:// sqlite:///foo.db mssql+pyodbc://username:password@host/database?driver=SQL+Server+Native+Client+11.0
请注意,mysql和mysql+pymysql连接(以及可能的其他连接)不会从.my.cnf读取客户端字符集信息。您需要在连接字符串中指定它。
mysql+pymysql://scott:tiger@localhost/foo?charset=utf8
请注意,使用impyla的impala连接需要禁用自动提交。
%config SqlMagic.autocommit=False %sql impala://hserverhost:port/default?kerberos_service_name=hive&auth_mechanism=GSSAPI
SQLAlchemy未列入白名单的连接参数可以作为JSON字符串的标志提供,与连接字符串一起使用(-a|–connection_arguments)。请参阅SQLAlchemy Args。
%sql –connection_arguments {“timeout”:10,”mode”:”ro”} sqlite:// SELECT * FROM work;%sql -a ‘{“timeout”:10, “mode”:”ro”}’ sqlite:// SELECT * from work;
DSN连接
或者,您可以将连接信息存储在配置文件中,在所选的章节名称下引用您的数据库。
例如,如果dsn.ini包含
[DB_CONFIG_1]drivername=postgreshost=my.remote.hostport=5433database=mydatabaseusername=myuserpassword=1234
那么您就可以
%config SqlMagic.dsn_filename=’./dsn.ini’%sql –section DB_CONFIG_1
配置
查询结果作为列表加载,因此非常大的结果集可能会耗尽系统内存和/或使浏览器挂起。默认情况下没有自动限制。然而,如果设置了autolimit,则限制结果集的大小(通常在SQL中使用LIMIT子句)。displaylimit类似,但整个结果集仍然被拉入内存(用于后续分析);只有屏幕显示被截断。
In [2]: %config SqlMagic
SqlMagic options
--------------
SqlMagic.autocommit=<Bool>
Current: True
Set autocommit mode
SqlMagic.autolimit=<Int>
Current: 0
Automatically limit the size of the returned result sets
SqlMagic.autopandas=<Bool>
Current: False
Return Pandas DataFrames instead of regular result sets
SqlMagic.column_local_vars=<Bool>
Current: False
Return data into local variables from column names
SqlMagic.displaycon=<Bool>
Current: False
Show connection string after execute
SqlMagic.displaylimit=<Int>
Current: None
Automatically limit the number of rows displayed (full result set is still
stored)
SqlMagic.dsn_filename=<Unicode>
Current: 'odbc.ini'
Path to DSN file. When the first argument is of the form [section], a
sqlalchemy connection string is formed from the matching section in the DSN
file.
SqlMagic.feedback=<Bool>
Current: False
Print number of rows affected by DML
SqlMagic.short_errors=<Bool>
Current: True
Don't display the full traceback on SQL Programming Error
SqlMagic.style=<Unicode>
Current: 'DEFAULT'
Set the table printing style to any of prettytable's defined styles
(currently DEFAULT, MSWORD_FRIENDLY, PLAIN_COLUMNS, RANDOM)
In[3]: %config SqlMagic.feedback = False
请注意:如果您将autopandas设置为true,则displaylimit选项将不适用。您可以通过使用pandas max_rows选项来设置pandas显示限制,如pandas文档中所述。
Pandas
如果您已安装pandas,则可以使用结果集的.DataFrame()方法。
In [3]: result = %sql SELECT * FROM character WHERE speechcount > 25
In [4]: dataframe = result.DataFrame()
--persist参数,带有内存中DataFrame对象的名称,将在数据库中创建一个表名。或者使用--append通过该名称向现有表添加行。
In [5]: %sql --persist dataframe
In [6]: %sql SELECT * FROM dataframe;
绘图
如果您已安装 matplotlib,您可以使用结果集的 .plot()、.pie() 和 .bar() 方法进行快速绘图
In[5]: result = %sql SELECT title, totalwords FROM work WHERE genretype = 'c'
In[6]: %matplotlib inline
In[7]: result.pie()
转储
结果集包含一个 .csv(filename=None) 方法。这会生成逗号分隔的文本,要么作为返回值(如果未指定 filename),要么作为给定名称的文件。
In[8]: result = %sql SELECT title, totalwords FROM work WHERE genretype = 'c'
In[9]: result.csv(filename='work.csv')
PostgreSQL 特性
psql-风格的“反斜杠” 元命令(\d、\dt 等)由 PGSpecial 提供。示例
In[9]: %sql \d
选项
- -l / --connections
列出所有活动连接
- -x / --close <session-name>
关闭命名连接
- -c / --creator <creator-function>
指定新连接的创建函数
- -s / --section <section-name>
用于生成连接字符串的 dsn_file 的部分
- -p / --persist
从命名 DataFrame 创建数据库中的表名
- --append
类似于 --persist,但如果表已存在,则附加到表中
- -a / --connection_arguments <"{connection arguments}">
指定要传递给 SQL 驱动程序的连接参数字典
- -f / --file <path>
从此路径运行 SQL 文件
注意
注释
因为 ipyton-sql 接受如 --persist 这样的用短横线分隔的选项,但短横线也是表示 SQL 注释的语法,解析器需要做出一些假设。
如果您尝试传递一个不受支持的参数,例如 --lutefisk,它将被解释为 SQL 注释,而不会抛出不受支持的参数异常。
如果 SQL 语句以看起来像是接受的参数之一的第一行注释开始 - 例如 %sql --persist is great! - 它将被解析为参数,而不是注释。将注释移到第二行或之后可以避免这种情况。
安装
使用以下命令安装最新版本
pip install ipython-sql
或从 https://github.com/catherinedevlin/ipython-sql 下载并
cd ipython-sql sudo python setup.py install
开发
致谢
Matthias Bussonnier 帮助配置
Olivier Le Thanh Duong 对 %config 修复和改进
Mike Wilson 为绑定变量代码
Thomas Kluyver 和 Steve Holden 为调试帮助
Berton Earnshaw 为 DSN 连接语法
Bruno Harbulot 为 DSN 示例
Andrés Celis 为 SQL Server 错误修复
Michael Erasmus 为 DataFrame 真实性错误修复
Noam Finkelstein 为 README 清晰度
Xiaochuan Yu 为 << 运算符、语法着色
Amjith Ramanujam 为 PGSpecial 以及将其集成在这里
Alexander Maznev 为更好的参数解析、接受指定创建者的连接
Jonathan Larkin 为可配置的 displaycon
Jared Moore 为 connection-arguments 支持
吉尔伯特·布拉特为 --append
卢卡斯·泽尔为变量替换的多行错误修复,<<
vvk800为--file
延斯·阿尔布雷希特为MySQL DatabaseError错误修复
meihkv为连接关闭错误修复
Abhinav C为SQLAlchemy 2.0兼容性
新闻
0.1
发布日期:2013年3月21日
初始发布
0.1.1
发布日期:2013年3月29日
发布到PyPI
返回结果为列表
使用print(_)在文本控制台中获取表格格式
在配置中设置自动限制和文本换行
0.1.2
发布日期:2013年3月29日
Python 3兼容性
使用prettyprint包
允许每个单元格多个SQL
0.2.0
发布日期:2013年5月30日
接受绑定变量(感谢迈克·威尔逊!)
0.2.1
发布日期:2013年6月15日
识别套接字连接字符串
错误修复 - 问题4(通过案例记住现有连接)
0.2.2
发布日期:2013年7月30日
从IPython插件转换为1.0兼容性的扩展
0.2.2.1
发布日期:2013年8月1日
删除了0.2.2中遗留的插件导入
0.2.3
发布日期:2013年9月20日
来自Olivier Le Thanh Duong的贡献
不包含内部IPython错误堆栈报告SQL错误
正确处理配置
将.DataFrame()、.pie()、.plot()和.bar()方法添加到结果集中
0.3.0
发布日期:2013年10月13日
displaylimit配置参数
报告每个查询影响的行数
测试套件再次工作
通过主键以字典样式访问结果集
0.3.1
使用
可配置地报告影响的行数 本地变量可用作SQL绑定变量
0.3.2
为结果集添加了.csv(filename=None)方法
0.3.3
恢复Python 3兼容性
支持DSN访问(感谢伯特·伊恩肖)
0.3.4
添加了PERSIST伪-SQL命令
0.3.5
在HTML单元格中可见缩进
立即COMMIT每个SQL语句 - 防止锁定
0.3.6
修复了sqlite的提交失败问题(感谢stonebig、jandot)
0.3.7
由darikg提交的新column_local_vars配置选项
避免本地污染用户命名空间(感谢alope107)
0.3.7.1
避免SQL Server的“连接忙”错误(感谢Andrés Celis)
0.3.8
关闭IPython 4中对IPython 3 traitlets的弃用警告(感谢graphaelli;也感谢stonebig、aebrahim、mccahill)
从eshilts更新README以保持连接信息私有
0.3.9
修复DataFrame错误的真值(感谢michael-erasmus)
<<运算符(感谢xiaochuanyu)
添加README示例(感谢tanhuil)
执行column_local_vars的bug修复(感谢tebeka)
pgspecial安装可选(感谢jstoebel和arjoe)
在连接字符串中隐藏密码(感谢jstoebel)
0.3.9
恢复Python 2兼容性(感谢tokenmathguy)
0.4.0
将大多数非SQL命令更改为argparse参数(感谢pik)
用户可以指定连接的创建者(感谢pik)
删除了虚假的伪-SQL命令PERSIST,用–persist参数替换
在配置中使用displaycon关闭连接信息的回显
一致支持{}变量(感谢Lucas)
0.4.1
修复了MANIFEST.in中的.rst文件位置
解析第一行的SQL注释
修复了DSN、–close和其他的bug
0.5.0
使用SQLAlchemy 2.0
删除了对原始行实例的字典样式访问的非官方支持
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
ipython-sql-0.5.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3db3ce7f9a95dfaf43876fa80b16bdbb9a04de0ba12042cab13e9f596fcffdbe |
|
MD5 | 63525f1936658d1a5a704ccc2941ad55 |
|
BLAKE2b-256 | d0ba5a396a3b5bda93943479e7e79511ccec00f5b7ac30d0ed9072a1e69ee1a6 |
ipython_sql-0.5.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b |
|
MD5 | 60160d38a2f51ee6b82b8f95f67ad8b3 |
|
BLAKE2b-256 | 308f9e50fa53ffc371483f9d1b90c1175b706d28a2e978e90a8894035af01905 |