第一次使用STEEMSQL查询谷哥点名数据

in #cn7 years ago

首先感谢 @arcange 提供 SteemSQL服务,SteemSQL是一个包含STEEM区块链数据的公共MS-SQL数据库。

First thanks @arcange for providing SteemSQL services, SteemSQL is a public MS-SQL database with all the blockchain data in it.


其实SteemSQL上线之初我马上试用过,但是因为当时第一版只包含一些区块链的transaction数据,用起来还有诸多不便,所以后来SteemData一上线,我就转移战场了,尽管我从来未接触过MongoDB。之后,SteemData一直能满足我的需求,所以就懒得转战回来,但是我依然默默关注这个项目,看着它经过十多次升级变得越来越好,也看着很多STEEMIT的朋友开始使用这个数据库。

今天 @jubi 和我说使用SteemSQL 查询中文标题遇到一些困难,用WHERE title like '%第一次%'作为查询条件,查询不到相关数据,但是用英文则可以查询,我答应帮他看看。话说最近他在中文区举办两期谷哥点名活动,人气火爆,而第一次就是第二期活动的主题。估计太火爆,参与人数众多,单纯地靠人工看帖和整理有些辛苦,于是他想着用程序把整理帖子自动化吧。大家都在成长,这非常好。说到SteemSQL最近,中文区的很多朋友都在用,比如 @ace108, 以及 @joythewanderer, 他们还出过一些向导贴,大家感兴趣可以去翻一翻。

又扯远了,言归正传

安装pymssql

我懒得去下桌面软件,还是直接用Python吧
Python下可以使用pyodbc 以及 pymssql啥的,我选择的是pymssql

直接在命令行下直接安装指令
pip3 install pymssql

嘎,报一大堆错误, 其它啥的都不认识,我关注的大概三句

Running setup.py bdist_wheel for pymssql ... error
setup.py: Not using bundled FreeTDS
_mssql.c:266:22: fatal error: sqlfront.h: No such file or directory

去官网查了一下
http://pymssql.org/en/stable/building_and_developing.html
有这样一句

FreeTDS >= 0.91 including development files. Please research your OS usual software distribution channels, e.g, freetds-dev or freetds-devel packages.

缺啥补啥
sudo apt-get install freetds-dev
pip3 install pymssql

成功!

执行

SteemSQL 官网地址: http://steemsql.com/
但是很遗憾上边的链接信息不全,没有Database的信息
或许连上之后,就直接可以查出来,不过我在SteemSQL发布的帖子中找到了连接信息

Server: sql.steemsql.com
User: steemit
Password: steemit
Database name: DBSteem

import pymssql
conn = pymssql.connect(host ="sql.steemsql.com",database ="DBSteem",user="steemit",password="steemit")
在Python里用这个直接连上了,很好。

试着查了一下
cur = conn.cursor()
cur.execute("SELECT title FROM Comments WHERE author= 'oflyhigh' and title like '%区块链%'")

因为我昨天刚写了一篇文章,
使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain

为啥就查不到呢?

然后换个关键词
cur.execute("SELECT title FROM Comments WHERE author= 'oflyhigh' and title like '%PHP%'")

('How to install Apache、MYSQL、PHP5 and run a Wordpress website on BananaPi',), ('拖了很久的事情终于完成了,将PHP 5.4 升级到 PHP 5.6',), ('使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain',)

查出来的文章包含我的最新文章

排查

那么是哪里有问题导致的呢?
我第一个直觉是编码问题

然后,我把链接改成
conn = pymssql.connect(host ="sql.steemsql.com",database ="DBSteem",user="steemit",password="steemit", charset="utf8")
结果依旧

又去把FreeTDS的配置文件中加上字符集设置
sudo find / -name freetds.conf
sudo vi /etc/freetds/freetds.conf
sudo vi /usr/share/freetds/freetds.conf
通通加上:
client charset = UTF-8
结果依旧

尽管我觉得没必要,但是,又在Python文件中加上
#-*- coding: utf-8 -*-
结果依旧

从查出的结果能正常显示来看,数据应该是按UTF-8存储的,那问题出在哪里呢?三把板斧用完了,我的找新招数了。

研究半天,发现个新玩意,就是在查询内容前加个N
详情见
https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql

Prefix Unicode character string constants with the letter N. Without the N prefix, the string is converted to the default code page of the database. This default code page may not recognize certain characters.

把我的查询改成:
cur.execute("SELECT title FROM Comments WHERE author= 'oflyhigh' and title like N'%区块链%'")

查询结果如下:

我也曾经文青过,18年前写的小诗 《花儿》,学laoyao,咱也放到区块链上
使用PHP查询STEEM区块链 / Using PHP to query the STEEM blockchain
珍惜羽毛 / STEEM区块链忠实的记录你的操作 / 获得共同操作账户的真实操作者
YY 一个基于STEEM区块链的聊天工具
STEEM区块链忠实的记录你的言行&操作

终于可行了

再查谷歌点名贴

现在在回头查参加谷歌点名的第二次活动的帖子,主题为第一次

cur.execute("SELECT title,created FROM Comments WHERE title like N'%第一次%' and created > '2017/08/01' order by created")
rows = cur.fetchall()
for row in rows: print("{}\t{}".format(row[0], row[1]))

结果如下:

Magic Clay 你第一次用黏土做了什么呢? 2017-08-01 14:13:45
第一次花費從steemit賺到的收益 ! The first time I get the 'real' money from steemit! 2017-08-02 06:11:21
第一次与你们的对话,my first conversation with y'all . 2017-08-03 18:32:51
第一次在steemit cn发文 感谢steemit让我能接触Bitcoin 2017-08-04 17:09:18
第一次人体解剖课上的惊悚事件 2017-08-07 11:30:48
第一次 - 離鄉別井 | “谷哥点名”活动 2017-08-09 07:10:30
相约大美新疆,第一次在第13届全国冬运会现场 Meet the beauty of Xinjiang,first time in China national winter games 2017-08-09 08:31:15
My first encounter with steemit/我与steemit的第一次邂逅 | 谷歌点名 2017-08-09 10:15:33
我人生的N种第一次 2017-08-09 10:31:48
第一次认识这个世界 2017-08-09 10:52:12
第一次 - 英國行山篇 "谷歌点名"活動 Hiking South Downs Way England 2017-08-09 11:00:00
【参加谷哥点名】我在Steemit的第一次发帖 2017-08-09 13:07:39
第一次离开熟悉的地方外出闯荡 2017-08-09 14:12:33
成就人生的第一次 2017-08-09 14:26:54
第一次 // First Time 2017-08-09 17:11:42
人生第一次——不仅有酸甜苦辣,更有悲欢离合 2017-08-09 18:12:18
第一次 - The First Time (Chinese content only but feel free to comment in English if you understsand) - (by @ace108) 2017-08-10 00:34:03
第一次, 细看妈妈的皱纹| “谷哥点名”活动 2017-08-10 01:11:24
爱上第一次--First Exploration 2017-08-10 01:22:15
如何看待你人生中的第一次? 2017-08-10 01:24:48
?? 老道茶館 ??-請上坐,喝杯茶,說點事;今日話題-第一次 (跨域合作:茶館X谷哥点名) ?? LAODR Tea House ?? 170810 2017-08-10 02:06:03
#隨筆2 第一次 | 谷哥点名 2017-08-10 03:55:33
第一次在星级大酒店吃饭 2017-08-10 04:09:12
第一次绝恋--最后的初恋 The first but also last love. 2017-08-10 04:37:30
第一次品味人生百态 My First Time - Ups and Downs in Life 2017-08-10 05:10:51
第一次 ── 我和我的友生 2017-08-10 05:14:57
第一次拿到在steemit上写作的钱 2017-08-10 05:44:24
领导,今天是我第一次喝酒,可不可以。。。 2017-08-10 06:52:42
第一次去博物馆之中国古代的酒具 The ancient wine cups of the Chinese history 2017-08-10 11:40:54
第一次去油菜花地里玩,种下了心灵里的树 2017-08-10 13:56:00
My first and long leave from my hometown // 第一次離鄉別井 2017-08-10 18:45:03
The first time i made my rose steamed buns 第一次做玫瑰花馒头! 2017-08-10 21:50:18
第一次 — 住在大学宿舍经历 / 谷哥点名活动 | My university life, my first time living in a university hostel 2017-08-10 23:03:06
第一次 - 在第一次家族旅行 - 台中 (內有家族旅行的心得)| The first time - My first family trip - Tai Chung 2017-08-11 01:16:42
很多第一次的第一次 | "谷哥点名" 2017-08-11 01:30:00
第一次“体验”做父母的感觉 / The First Time for Being a "Parent" | 谷歌点名 2017-08-11 04:10:27
第一次来华文区时的情景与华文区如何发展 2017-08-11 06:23:21
第一次注册域名 2017-08-11 08:18:54
第一次,科學研究的第一次/ “谷哥点名”活动 The First time: The Tirst Time for Scientific Research 2017-08-11 09:15:57
第一次去海边 —— “温良恭俭让”的北威尔士海滨小镇兰迪德诺 2017-08-11 09:28:42
第二期“谷哥点名”活動: 第一次 離鄉別井 2017-08-11 09:36:03
我的第一次的虛擬人生 2017-08-11 10:22:18
一天之内的两个第一次 2017-08-11 10:37:51

总算没辜负 @jubi 小友的信任

补充

@jubi 用另外一种方法
WHERE contains(title, '第一次')
可以查出部分数据
我搜索了一下,contains是基于全文索引进行查询
但结果可能受系统分词方法的影响导致不全

当然,也可能是我不会使用的缘故 😭


也加俩第一次关键字参赛,重在参与
另外,万一中奖呢,哈哈哈

Sort:  

建议一下你加个 WAIT (NOLOCK) 比如:

SELECT 
   author, title,created 
FROM Comments WAIT (NOLOCK)  
WHERE title like N'%第一次%' 
  and created > '2017/08/01' 
order by created
也是昨天找furion问steemsql缺数据的问题他告诉我的。 这样不会把数据库锁住。我用Oracle没这必要但MS SQL Server 好像这比较好。 呵呵。。。我也来看个究竟。 哦,我在中间。:-) ![]()

感谢专家指点
MSSQL我很少用,除了以前做项目的时候接触过一两次
以后和你们多学习

另外, steemsql少数据你找furion干啥,他是steemdata的 😀

哦错了,是 arcange. 我也找 furion 问sbds.那里数据也好像过时。
MSSQL 我也刚开始用。不是专家。 :-)
Oracle 的就用过很多年了。

WAIT (NOLOCK) 顺便查了一下 NOLOCK 懂了个大概,感谢大神!

别客气。我非大神。 也是最近得指点上网找了下才知。 :-)

hi @oflyhigh...... A very useful post for all steemit users around the world, hoping those who read it can post every piece of their writing beautifully by using such a good basic procedure, organized and nice to read, how not to. Using the clues you share can give birth to works that look very unusual.
Continue to work @oflyhigh good luck continued and many gave birth to the benefits for many people

谢谢O哥,我也试着查过中文关键字,但是怎么都出不了数据
原来是少了个N,我试过用%%代替一个%,也试过%%ch,都出不来,谢谢解答疑惑。

其实和字段的存储方式有关
我查了一下title字段存储成nvarchar
加个N前缀,就强制使用UNICODE编码,而不是转换成数据库默认编码

具体细节我也不太懂,好多年没怎么用了
我第一直觉就是编码问题,但是也是试了好几种办法才找到当前方案的

👍 真是学习了!中文关键字真是大难题。

互相学习

English translation please?

Thanks, very informative, I am following you now @oflyhigh

Thank you for sharing with us! I hope you enjoy the upvote!

赞,收藏先。

O 哥哥 這個很實用啊 👍

谢谢夸奖

万一中奖了呢……

O婶威武啊

诗王威武!