{ "info": { "author": "Alessandro Scoccia Pappagallo", "author_email": "aless@ndro.xyz", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# gSpread DB\n\nAnton Burnashev's [gspread](https://github.com/burnash/gspread) is a great package to interact with Google Spreadsheet in Python. The package offers a spreadsheet-like interface where users can create and remove worksheets, update cell values, append new values, etc. For many users that may be the most intuitive and convenient way to interact with Google Spreadsheet but for many applications Google Spreadsheet is fundamentally just another database and thus a database-like interface may make more sense.\n\n**gSpread DB** adds a new API to gspread that supports the most common database operations like insert, delete, select and update. Specifically, a spreadsheet is considered a database, a worksheet a table and the first row of each table/worksheet the header of the table. All operations thus rely on this header to understand which fields is what.\n\nYou can install gspread_db via Pip:\n\n```python\npip3 install gspread_db\n```\n\nThen, you can start moving data around:\n\n```python\nimport gspread_db\n\n# You can learn more about how to register your\n# service and get API credentials at:\n# https://gspread.readthedocs.io/en/latest/oauth2.html\nspreadsheet_key = 'spreadsheet-key'\nkeyfile_dict = {\n 'type': 'service_account',\n 'project_id': 'you-project-id',\n 'private_key_id': 'prive-key-id',\n 'private_key': 'a-very-long-string',\n '...': '...'\n}\n\nscope = ['https://spreadsheets.google.com/feeds']\nauth = oauth2client.service_account.ServiceAccountCredentials\ncredentials = auth.from_json_keyfile_dict(keyfile_dict, scope)\n\nclient = gspread_db.authorize(credentials)\ndb = client.open_by_key(spreadsheet_key)\n\ndb.create_table(table_name='Users', header=['Username', 'Email'])\nusers = db['Users']\nusers.insert({'Username': 'annoys_parrot', 'Email': 'not-my-email@email.com'})\nalessandro = users.select('Username', 'annoys_parrot')\n```\n\nNote that `select` operations return `pd.DataFrame` by default. This can be changed by setting the `as_pandas` argument to `False`.\n\nIt's important to note the header of the table (i.e. first row of the spreadsheet) is not just an aesthetic element. If we try to insert a new record with fields that are not contained in the header the operation will fail.\n\n```python\n>>> _ = users.select(limit=1)\n>>> users.header\n['Username', 'Email']\n>>> user.insert({'Password': '123456'})\nRecordError: Keys in record must be a sub-set of header.\n```\n\nNote that as of version 1.0 in order for `Table().header` to return anything an operation must have been performed first (which is the reason why in the first line of the example above we select one row). This is because the header in the spreadsheet is parsed before every operation but not at instantiation time.\n\nA more comprehensive example:\n\n```python\ndb.create_table(table_name='Users', header=['Username', 'Email'])\ndb['Users'].insert({'Username': 'Alan', 'Email': 'alan@turing.com'})\n\n# There are multiple ways to select users.\nalan = db['Users'].select('Username', 'Alan', as_pandas=False)\nturing = db['Users'].select(where=[('Username', 'eq', 'Alan')], as_pandas=False)\n\nalan == turing # True\n\nprint(alan)\n# {\n# 'Username': 'Alan',\n# 'Email': 'alan@turing.com'\n# }\n\n# We can also limit the number of fields returned.\nalan_email = db['Users'].select('Username', 'Alan', fields=['Email'])\n\n# We can update values for records matching some criteria.\ndb['Users'].update('Username', 'Alan', new_values={'Email': 'new@email.com'})\n\n# Lastly, we can delete records that match some criteria.\ndb['Users'].delete('Username', 'Alan')\n\n# Note that for both update and delete all matching records will be updated\n# or deleted. Make sure your conditions only match the right records!\n```\n\n# Documentation\n\nNote that because gspread_db is just a wrapper around gspread, all methods available in gspread for [Spreasheet](https://gspread.readthedocs.io/en/latest/#gspread.models.Spreadsheet) and [Worksheet](https://gspread.readthedocs.io/en/latest/#gspread.models.Worksheet) are also available in gspread_db for Database and Table.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/annoys-parrot/gspread_db", "keywords": "database google spreadsheets", "license": "", "maintainer": "", "maintainer_email": "", "name": "gspread-db", "package_url": "https://pypi.org/project/gspread-db/", "platform": "", "project_url": "https://pypi.org/project/gspread-db/", "project_urls": { "Homepage": "https://github.com/annoys-parrot/gspread_db" }, "release_url": "https://pypi.org/project/gspread-db/1.2/", "requires_dist": [ "pandas", "gspread" ], "requires_python": "", "summary": "A database-like interface for gspread.", "version": "1.2" }, "last_serial": 4578169, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "cacaaebbdf5e91361448ae855b216458", "sha256": "6ff23d51f27c48fc438655b25421daa1da1c96a0896576d9b86053368216f65f" }, "downloads": -1, "filename": "gspread_db-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cacaaebbdf5e91361448ae855b216458", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7901, "upload_time": "2018-09-11T04:29:45", "url": "https://files.pythonhosted.org/packages/ce/2c/cf91c5a8abad99cfc341ba5bd8fe0507ea172e819689a25cbdc10de7ff1b/gspread_db-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5126cb6da32e1c2c00a3f726bcd1b91a", "sha256": "6b1b9cc4a9a28c4fb13a6c8e5f726c52cbb16f8e3eaabda7809524c02db389fa" }, "downloads": -1, "filename": "gspread_db-1.0.tar.gz", "has_sig": false, "md5_digest": "5126cb6da32e1c2c00a3f726bcd1b91a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7364, "upload_time": "2018-09-11T04:29:47", "url": "https://files.pythonhosted.org/packages/85/0b/e3e38b39f7e18db004331a84d1370969287ae2b65b12ad3a038641f3ee16/gspread_db-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "29569f3753ca0965e015f2582c0b04bf", "sha256": "10f693f10d99fd7f540e0edcc1d4ccad28276b80a68d433aaf519bdbc6ccda25" }, "downloads": -1, "filename": "gspread_db-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "29569f3753ca0965e015f2582c0b04bf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8724, "upload_time": "2018-12-06T08:19:49", "url": "https://files.pythonhosted.org/packages/d7/35/d558969c27f506e41ef678b01c6f169a1b16044bda61a4ca0a2bfe54bf9a/gspread_db-1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c63d56365191cbcfe40f6c275300fc9", "sha256": "7c74def9eee95ba175529b79f4784f3d498aefaaa7a55ccc1db8391fa3de49b7" }, "downloads": -1, "filename": "gspread_db-1.1.tar.gz", "has_sig": false, "md5_digest": "2c63d56365191cbcfe40f6c275300fc9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7050, "upload_time": "2018-12-06T08:19:50", "url": "https://files.pythonhosted.org/packages/13/a0/c67d16384ebfbeae34f0e46c83b80cbbf0d86406cabaea9d6ab488b841a2/gspread_db-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "a9583ec43cf14ffc4e097349cef7bedb", "sha256": "91e951a5ce40b54b785c3e48aefd6b6de148d76af3715e28d63a752aac8a42f8" }, "downloads": -1, "filename": "gspread_db-1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a9583ec43cf14ffc4e097349cef7bedb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8723, "upload_time": "2018-12-09T21:01:46", "url": "https://files.pythonhosted.org/packages/3c/b7/0d8df0aeef3114f0c3eddce2de66804737fbe41aa2b2e0ca6ee23b22d487/gspread_db-1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "14bedf7042e27da7aeb5011245cd0825", "sha256": "d364d3a6e58bbd498ea9748b87235e3948c2f6d6d8b21b71ac029b376095cc45" }, "downloads": -1, "filename": "gspread_db-1.2.tar.gz", "has_sig": false, "md5_digest": "14bedf7042e27da7aeb5011245cd0825", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7061, "upload_time": "2018-12-09T21:01:48", "url": "https://files.pythonhosted.org/packages/91/bc/f79336698f0734fda2eca4d5de8119c5362334f281fa5534d01df4fe395c/gspread_db-1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a9583ec43cf14ffc4e097349cef7bedb", "sha256": "91e951a5ce40b54b785c3e48aefd6b6de148d76af3715e28d63a752aac8a42f8" }, "downloads": -1, "filename": "gspread_db-1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a9583ec43cf14ffc4e097349cef7bedb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8723, "upload_time": "2018-12-09T21:01:46", "url": "https://files.pythonhosted.org/packages/3c/b7/0d8df0aeef3114f0c3eddce2de66804737fbe41aa2b2e0ca6ee23b22d487/gspread_db-1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "14bedf7042e27da7aeb5011245cd0825", "sha256": "d364d3a6e58bbd498ea9748b87235e3948c2f6d6d8b21b71ac029b376095cc45" }, "downloads": -1, "filename": "gspread_db-1.2.tar.gz", "has_sig": false, "md5_digest": "14bedf7042e27da7aeb5011245cd0825", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7061, "upload_time": "2018-12-09T21:01:48", "url": "https://files.pythonhosted.org/packages/91/bc/f79336698f0734fda2eca4d5de8119c5362334f281fa5534d01df4fe395c/gspread_db-1.2.tar.gz" } ] }