SQLAlchemy复杂查询

SQLAlchemy的查询方式非常灵活,你所能想像到的复杂SQL 语句,基本上都可以实现。这里简单的总结一下常用的查询技巧。

  1. 多条件组合,可以用and_,or_实现。最外层时,and_可以省略,默认用逗号分开条件。
    复制代码
    db.session.query(User).filter(
            and_(
                or_(User.name==name1,User.name==name2),
                or_(User.status==1,User.status==2)
            ),
            User.active==1
        ).first()
    复制代码

     

  2. 动态组合条件。针对不同的场景,可能需要不同的查询条件,类似动态的拼接SQL 语句。
    复制代码
            if filter_type == 1:
                search = and_(GameRoom.status ==1,or_(
                    and_(GameRoom.white_user_id == user_id,
                         GameRoom.active_player == 1),
                    and_(GameRoom.black_user_id == user_id,
                         GameRoom.active_player == 0)))
            elif filter_type == 2:
                search = and_(GameRoom.status ==1,or_(
                    and_(GameRoom.white_user_id == user_id,
                         GameRoom.active_player == 0),
                    and_(GameRoom.black_user_id == user_id,
                         GameRoom.active_player == 1)))
            elif filter_type == 3:
                search = GameRoom.create_by == user_id
            
            db.session.query(GameRoom).filter(search).all()
    复制代码

     

  3. 关联查询。对应SQL的join和left join等。
        session.query(User, Address).filter(User.id == Address.user_id).all()
        session.query(User).join(User.addresses).all()
        session.query(User).outerjoin(User.addresses).all()

     

  4. 使用别名用aliased,aliased在orm包中。当要对同一个表使用多次关联时,可能需要用到别名。同时,如果查询的结果有多个同名的字段,可以使用label重命名。
    复制代码
    black_user = orm.aliased(User)
    white_user = orm.aliased(User)
    db.session.query(
                GameRoom,
                black_user.score.label("black_score"),
                white_user.score.label("white_score")
                ).outerjoin(black_user,GameRoom.black_user_id==black_user.user_id).outerjoin(
                    white_user,GameRoom.white_user_id==white_user.user_id).filter(
                        GameRoom.id==room_id
                ).all()
    复制代码

     

  5. 聚合查询和使用数据库函数。func可以调用各种聚合函数,和当前数据库支持的其它函数。
    session.query(User.name, func.count('*').label("user_count")).group_by(User.name).all()
    
    session.query(User.name, func.sum(User.id).label("user_id_sum")).filter(func.to_days(User.create_date)==func.to_days(func.now())).group_by(User.name).all()

     

  6.  子查询。
    stmt = db.session.query(Address.user_id, func.count('*').label("address_count")).group_by(Address.user_id).subquery()
    db.session.query(User, stmt.c.address_count).outerjoin((stmt, User.id == stmt.c.user_id)).order_by(User.id).all()

     

  7. 直接运行SQL语句查询。如果查询实在太复杂,觉得用SQLAlchemy查询方式很难实现,或者要通过存储过程实现查询,可以让SQLAlchemy直接运行SQL语句返回结果。
    复制代码
            sql ="""select b.user_id,b.user_name,b.icon,b.score,a.add_score from
                (select user_id, sum(score_new - score_old) as add_score from user_score_log
                where year(create_date)=year(now()) and month(create_date)=month(now())
                group by user_id) a join users b on a.user_id=b.user_id
                order by a.add_score desc limit 50"""
            list_top = db.session.execute(sql).fetchall()
    复制代码

     

  8. 分页查询。sqlalchemy中分页用到pagination,先不说性能怎么样,使用起来是真的非常方便。
            pagination = GameMessage.query.filter(GameMessage.game_id==game_id).\
                order_by(GameMessage.id.desc()).\
                paginate(page, per_page=20, error_out=True)
            pages = pagination.pages
            total = pagination.total
            items = pagination.items

     

总的来说,SQLAlchemy是我用过的最好的ORM 框架之一(其实我最熟的是.net,python也只用过这一个ORM工具)。基本上常见的SQL 语句,这里都已经实现。如果你的查询实在太复杂的,可能需要用存储过程来实现,直接运行SQL也不失为一种简便的方法。

各个时区对应的时差表

Africa/Abidjan  +00:00
Africa/Accra    +00:00
Africa/Addis_Ababa      +03:00
Africa/Algiers  +01:00
Africa/Asmara   +03:00
Africa/Bamako   +00:00
Africa/Bangui   +01:00
Africa/Banjul   +00:00
Africa/Bissau   +00:00
Africa/Blantyre +02:00
Africa/Brazzaville      +01:00
Africa/Bujumbura        +02:00
Africa/Cairo    +02:00
Africa/Casablanca       +00:00
Africa/Ceuta    +01:00
Africa/Conakry  +00:00
Africa/Dakar    +00:00
Africa/Dar_es_Salaam    +03:00
Africa/Djibouti +03:00
Africa/Douala   +01:00
Africa/El_Aaiun +00:00
Africa/Freetown +00:00
Africa/Gaborone +02:00
Africa/Harare   +02:00
Africa/Johannesburg     +02:00
Africa/Kampala  +03:00
Africa/Khartoum +03:00
Africa/Kigali   +02:00
Africa/Kinshasa +01:00
Africa/Lagos    +01:00
Africa/Libreville       +01:00
Africa/Lome     +00:00
Africa/Luanda   +01:00
Africa/Lubumbashi       +02:00
Africa/Lusaka   +02:00
Africa/Malabo   +01:00
Africa/Maputo   +02:00
Africa/Maseru   +02:00
Africa/Mbabane  +02:00
Africa/Mogadishu        +03:00
Africa/Monrovia +00:00
Africa/Nairobi  +03:00
Africa/Ndjamena +01:00
Africa/Niamey   +01:00
Africa/Nouakchott       +00:00
Africa/Ouagadougou      +00:00
Africa/Porto-Novo       +01:00
Africa/Sao_Tome +00:00
Africa/Tripoli  +02:00
Africa/Tunis    +01:00
Africa/Windhoek +02:00
America/Adak    -10:00
America/Anchorage       -09:00
America/Anguilla        -04:00
America/Antigua -04:00
America/Araguaina       -03:00
America/Argentina/Buenos_Aires  -02:00
America/Argentina/Catamarca     -03:00
America/Argentina/Cordoba       -02:00
America/Argentina/Jujuy -03:00
America/Argentina/La_Rioja      -03:00
America/Argentina/Mendoza       -03:00
America/Argentina/Rio_Gallegos  -03:00
America/Argentina/Salta -03:00
America/Argentina/San_Juan      -03:00
America/Argentina/San_Luis      -03:00
America/Argentina/Tucuman       -02:00
America/Argentina/Ushuaia       -03:00
America/Aruba   -04:00
America/Asuncion        -03:00
America/Atikokan        -05:00
America/Bahia   -03:00
America/Barbados        -04:00
America/Belem   -03:00
America/Belize  -06:00
America/Blanc-Sablon    -04:00
America/Boa_Vista       -04:00
America/Bogota  -05:00
America/Boise   -07:00
America/Cambridge_Bay   -07:00
America/Campo_Grande    -03:00
America/Cancun  -06:00
America/Caracas -04:30
America/Cayenne -03:00
America/Cayman  -05:00
America/Chicago -06:00
America/Chihuahua       -07:00
America/Costa_Rica      -06:00
America/Cuiaba  -03:00
America/Curacao -04:00
America/Danmarkshavn    +00:00
America/Dawson  -08:00
America/Dawson_Creek    -07:00
America/Denver  -07:00
America/Detroit -05:00
America/Dominica        -04:00
America/Edmonton        -07:00
America/Eirunepe        -04:00
America/El_Salvador     -06:00
America/Fortaleza       -03:00
America/Glace_Bay       -04:00
America/Godthab -03:00
America/Goose_Bay       -04:00
America/Grand_Turk      -05:00
America/Grenada -04:00
America/Guadeloupe      -04:00
America/Guatemala       -06:00
America/Guayaquil       -05:00
America/Guyana  -04:00
America/Halifax -04:00
America/Havana  -05:00
America/Hermosillo      -07:00
America/Indiana/Indianapolis    -05:00
America/Indiana/Knox    -06:00
America/Indiana/Marengo -05:00
America/Indiana/Petersburg      -05:00
America/Indiana/Tell_City       -06:00
America/Indiana/Vevay   -05:00
America/Indiana/Vincennes       -05:00
America/Indiana/Winamac -05:00
America/Inuvik  -07:00
America/Iqaluit -05:00
America/Jamaica -05:00
America/Juneau  -09:00
America/Kentucky/Louisville     -05:00
America/Kentucky/Monticello     -05:00
America/La_Paz  -04:00
America/Lima    -05:00
America/Los_Angeles     -08:00
America/Maceio  -03:00
America/Managua -06:00
America/Manaus  -04:00
America/Marigot -04:00
America/Martinique      -04:00
America/Mazatlan        -07:00
America/Menominee       -06:00
America/Merida  -06:00
America/Mexico_City     -06:00
America/Miquelon        -03:00
America/Moncton -04:00
America/Monterrey       -06:00
America/Montevideo      -02:00
America/Montreal        -05:00
America/Montserrat      -04:00
America/Nassau  -05:00
America/New_York        -05:00
America/Nipigon -05:00
America/Nome    -09:00
America/Noronha -02:00
America/North_Dakota/Center     -06:00
America/North_Dakota/New_Salem  -06:00
America/Panama  -05:00
America/Pangnirtung     -05:00
America/Paramaribo      -03:00
America/Phoenix -07:00
America/Port-au-Prince  -05:00
America/Port_of_Spain   -04:00
America/Porto_Velho     -04:00
America/Puerto_Rico     -04:00
America/Rainy_River     -06:00
America/Rankin_Inlet    -06:00
America/Recife  -03:00
America/Regina  -06:00
America/Resolute        -05:00
America/Rio_Branco      -04:00
America/Santarem        -03:00
America/Santiago        -03:00
America/Santo_Domingo   -04:00
America/Sao_Paulo       -02:00
America/Scoresbysund    -01:00
America/Shiprock        -07:00
America/St_Barthelemy   -04:00
America/St_Johns        -03:30
America/St_Kitts        -04:00
America/St_Lucia        -04:00
America/St_Thomas       -04:00
America/St_Vincent      -04:00
America/Swift_Current   -06:00
America/Tegucigalpa     -06:00
America/Thule   -04:00
America/Thunder_Bay     -05:00
America/Tijuana -08:00
America/Toronto -05:00
America/Tortola -04:00
America/Vancouver       -08:00
America/Whitehorse      -08:00
America/Winnipeg        -06:00
America/Yakutat -09:00
America/Yellowknife     -07:00
Antarctica/Casey        +08:00
Antarctica/Davis        +07:00
Antarctica/DumontDUrville       +10:00
Antarctica/Mawson       +06:00
Antarctica/McMurdo      +13:00
Antarctica/Palmer       -03:00
Antarctica/Rothera      -03:00
Antarctica/South_Pole   +13:00
Antarctica/Syowa        +03:00
Antarctica/Vostok       +06:00
Arctic/Longyearbyen     +01:00
Asia/Aden       +03:00
Asia/Almaty     +06:00
Asia/Amman      +02:00
Asia/Anadyr     +12:00
Asia/Aqtau      +05:00
Asia/Aqtobe     +05:00
Asia/Ashgabat   +05:00
Asia/Baghdad    +03:00
Asia/Bahrain    +03:00
Asia/Baku       +04:00
Asia/Bangkok    +07:00
Asia/Beirut     +02:00
Asia/Bishkek    +06:00
Asia/Brunei     +08:00
Asia/Choibalsan +08:00
Asia/Chongqing  +08:00
Asia/Colombo    +05:30
Asia/Damascus   +02:00
Asia/Dhaka      +07:00
Asia/Dili       +09:00
Asia/Dubai      +04:00
Asia/Dushanbe   +05:00
Asia/Gaza       +02:00
Asia/Harbin     +08:00
Asia/Ho_Chi_Minh        +07:00
Asia/Hong_Kong  +08:00
Asia/Hovd       +07:00
Asia/Irkutsk    +08:00
Asia/Jakarta    +07:00
Asia/Jayapura   +09:00
Asia/Jerusalem  +02:00
Asia/Kabul      +04:30
Asia/Kamchatka  +12:00
Asia/Karachi    +05:00
Asia/Kashgar    +08:00
Asia/Kathmandu  +05:45
Asia/Kolkata    +05:30
Asia/Krasnoyarsk        +07:00
Asia/Kuala_Lumpur       +08:00
Asia/Kuching    +08:00
Asia/Kuwait     +03:00
Asia/Macau      +08:00
Asia/Magadan    +11:00
Asia/Makassar   +08:00
Asia/Manila     +08:00
Asia/Muscat     +04:00
Asia/Nicosia    +02:00
Asia/Novosibirsk        +06:00
Asia/Omsk       +06:00
Asia/Oral       +05:00
Asia/Phnom_Penh +07:00
Asia/Pontianak  +07:00
Asia/Pyongyang  +09:00
Asia/Qatar      +03:00
Asia/Qyzylorda  +06:00
Asia/Rangoon    +06:30
Asia/Riyadh     +03:00
Asia/Sakhalin   +10:00
Asia/Samarkand  +05:00
Asia/Seoul      +09:00
Asia/Shanghai   +08:00
Asia/Singapore  +08:00
Asia/Taipei     +08:00
Asia/Tashkent   +05:00
Asia/Tbilisi    +04:00
Asia/Tehran     +03:30
Asia/Thimphu    +06:00
Asia/Tokyo      +09:00
Asia/Ulaanbaatar        +08:00
Asia/Urumqi     +08:00
Asia/Vientiane  +07:00
Asia/Vladivostok        +10:00
Asia/Yakutsk    +09:00
Asia/Yekaterinburg      +05:00
Asia/Yerevan    +04:00
Atlantic/Azores -01:00
Atlantic/Bermuda        -04:00
Atlantic/Canary +00:00
Atlantic/Cape_Verde     -01:00
Atlantic/Faroe  +00:00
Atlantic/Madeira        +00:00
Atlantic/Reykjavik      +00:00
Atlantic/South_Georgia  -02:00
Atlantic/St_Helena      +00:00
Atlantic/Stanley        -03:00
Australia/Adelaide      +10:30
Australia/Brisbane      +10:00
Australia/Broken_Hill   +10:30
Australia/Currie        +11:00
Australia/Darwin        +09:30
Australia/Eucla +08:45
Australia/Hobart        +11:00
Australia/Lindeman      +10:00
Australia/Lord_Howe     +11:00
Australia/Melbourne     +11:00
Australia/Perth +08:00
Australia/Sydney        +11:00
Europe/Amsterdam        +01:00
Europe/Andorra  +01:00
Europe/Athens   +02:00
Europe/Belgrade +01:00
Europe/Berlin   +01:00
Europe/Bratislava       +01:00
Europe/Brussels +01:00
Europe/Bucharest        +02:00
Europe/Budapest +01:00
Europe/Chisinau +02:00
Europe/Copenhagen       +01:00
Europe/Dublin   +00:00
Europe/Gibraltar        +01:00
Europe/Guernsey +00:00
Europe/Helsinki +02:00
Europe/Isle_of_Man      +00:00
Europe/Istanbul +02:00
Europe/Jersey   +00:00
Europe/Kaliningrad      +02:00
Europe/Kiev     +02:00
Europe/Lisbon   +00:00
Europe/Ljubljana        +01:00
Europe/London   +00:00
Europe/Luxembourg       +01:00
Europe/Madrid   +01:00
Europe/Malta    +01:00
Europe/Mariehamn        +02:00
Europe/Minsk    +02:00
Europe/Monaco   +01:00
Europe/Moscow   +03:00
Europe/Oslo     +01:00
Europe/Paris    +01:00
Europe/Podgorica        +01:00
Europe/Prague   +01:00
Europe/Riga     +02:00
Europe/Rome     +01:00
Europe/Samara   +04:00
Europe/San_Marino       +01:00
Europe/Sarajevo +01:00
Europe/Simferopol       +02:00
Europe/Skopje   +01:00
Europe/Sofia    +02:00
Europe/Stockholm        +01:00
Europe/Tallinn  +02:00
Europe/Tirane   +01:00
Europe/Uzhgorod +02:00
Europe/Vaduz    +01:00
Europe/Vatican  +01:00
Europe/Vienna   +01:00
Europe/Vilnius  +02:00
Europe/Volgograd        +03:00
Europe/Warsaw   +01:00
Europe/Zagreb   +01:00
Europe/Zaporozhye       +02:00
Europe/Zurich   +01:00
Indian/Antananarivo     +03:00
Indian/Chagos   +06:00
Indian/Christmas        +07:00
Indian/Cocos    +06:30
Indian/Comoro   +03:00
Indian/Kerguelen        +05:00
Indian/Mahe     +04:00
Indian/Maldives +05:00
Indian/Mauritius        +05:00
Indian/Mayotte  +03:00
Indian/Reunion  +04:00
Pacific/Apia    -11:00
Pacific/Auckland        +13:00
Pacific/Chatham +13:45
Pacific/Easter  -05:00
Pacific/Efate   +11:00
Pacific/Enderbury       +13:00
Pacific/Fakaofo -10:00
Pacific/Fiji    +12:00
Pacific/Funafuti        +12:00
Pacific/Galapagos       -06:00
Pacific/Gambier -09:00
Pacific/Guadalcanal     +11:00
Pacific/Guam    +10:00
Pacific/Honolulu        -10:00
Pacific/Johnston        -10:00
Pacific/Kiritimati      +14:00
Pacific/Kosrae  +11:00
Pacific/Kwajalein       +12:00
Pacific/Majuro  +12:00
Pacific/Marquesas       -09:30
Pacific/Midway  -11:00
Pacific/Nauru   +12:00
Pacific/Niue    -11:00
Pacific/Norfolk +11:30
Pacific/Noumea  +11:00
Pacific/Pago_Pago       -11:00
Pacific/Palau   +09:00
Pacific/Pitcairn        -08:00
Pacific/Ponape  +11:00
Pacific/Port_Moresby    +10:00
Pacific/Rarotonga       -10:00
Pacific/Saipan  +10:00
Pacific/Tahiti  -10:00
Pacific/Tarawa  +12:00
Pacific/Tongatapu       +13:00
Pacific/Truk    +10:00
Pacific/Wake    +12:00
Pacific/Wallis  +12:00
UTC     +00:00

python脚本:

import pytz
from datetime import datetime, timedelta
from pytz import timezone
tz = pytz.timezone('Africa/Abidjan')
#fmt = '%Y-%m-%d %H:%M:%S %Z%z'
fmt = '%z'
#utc_dt = datetime(1970, 1, 1, 0, 0, 0, tzinfo=pytz.utc)
utc_dt = datetime(2017, 12, 28, 13, 10, 0, tzinfo=pytz.utc)
loc_dt = utc_dt.astimezone(tz)
timezone_str = loc_dt.strftime(fmt)
timezone_str = timezone_str[:3] + ":" +  timezone_str[-2:]

树莓派开通root并且设置远程登录

树莓派默认账户是pi 默认密码是raspberry
在默认账户下激活root账户

输入一下命令
sudo passwd root
在执行完该命令后 系统会提示 输入两次密码 那么就输入 你设定的密码
再执行解锁账户命令
sudo passwd -unlock root

这样的话你的 root账户就激活了

接下来可以切换账户了
从普通账户切换到 root账户 直接输入 su root 就可以了 同样的道理 从root账户切换到普通账户 输入 su pi

虽然我们激活了root账户 但是远程登录root账户的时候还是会被拒绝 这个时候是因为 在/etc/ssh/sshd_config
里面的内容没有修改
直接 cd /etc/ssh 后 数据 nano sshd_config 将里面的
将 PermitRootLogin without-password 修改为 PermitRootLogin yes
重启,OK

接口文档神器-apidoc使用方法

1、安装
npm install apidoc -g

2、在app目录下生成配置文件apidoc.json
{
“version”: “1.0.0”,
“description”: “xxx核心接口”,
“title”: “ggg系统接口”,
“url” : “http://test.com”,
“sampleUrl”: “http://test.com”
}

3、执行生成
apidoc -i src/ -o apidoc/
src-代码文件夹
apidoc-doc静态文件生成路径

注释格式举例:
“””
@api {POST} /api/user/getUserInfo
@apiName 取得用户信息 api
@apiGroup Group
@apiVersion 1.0.1
@apiDescription 取得用户信息
@apiPermission 登录用户
@apiSampleRequest http://api.test.com/api/user/getUserInfo
@apiParam {int} [id] any id
@apiParamExample {json} 请求例子:
{
“id”: 4711
}
@apiSuccess (200) {String} msg 信息
@apiSuccess (200) {int} code 200
@apiSuccess (200) {String} name 真实姓名
@apiSuccess (200) {String} mobile 手机号
@apiSuccess (200) {String} birthday 生日
@apiSuccess (200) {String} email 邮箱
@apiSuccessExample {json} 返回样例:
{
“code”: 200,
“msg”: “”,
“name”: “真实姓名”,
“mobile”: 12345678901,
“birthday”: “1980-03-05”,
“email”: “test@gamil.com”
}
@apiErrorExample {json} 错误返回:
{
“code”: 14695
“msg”: “数据出错”
}
“””

@apiParam {String} [paging=turn] 页式:slide-滑动(向上向下滚动效果时使用,手机端使用该参数值)turn-翻页模式,PC端使用
@apiParam {Integer} [index=0] 索引值 不同页式时的输入值:slide:最后一个条目的编号item_id turn:条目偏移量
@apiParam {Integer} [page_size=20] 每页显示条目数