{ "info": { "author": "Heath Sutton", "author_email": "87thstreetdevelopment@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "pgvctrl\n=======\n\nDatabase **pgvctrl** is a tool designed to help deploy changes to\npostgres databases. All changes are stored in versioned folders with the\norder of execution set by the programmer.\n\nPrerequisites:\n--------------\n\n#. `postgres `__ ;)\n#. A general knowledge of postgres sql.\n `tutorial `__\n#. Python3\n\nGetting started:\n----------------\n\npip install\n-----------\n\n.. code-block::\n\n pip install pgvctrl\n\ngithub\n------\n\nDownload or clone the repository\n\nInstall\n-------\n\n.. code-block::\n\n python setup.py install\n\nGet help:\n\n.. code-block::\n\n pgvctrl -h\n\nGet version:\n\n.. code-block::\n\n pgvctrl -version\n\nRunning the tests\n-----------------\n\nIn the test directory:\n\n.. code-block::\n\n pytest\n\n.. _getting-started-1:\n\nGetting Started\n---------------\n\n#. If you don\u2019t already have a database, create one on your postgres\n server.\n#. Create pgvctrl dbRepoConfig:\n\n 1. Make a directory where you want you database repositories to live.\n\n .. code-block::\n\n pgvctrl -mkconf\n\n This will create a dbRepoConfig.json file.\n\n#. Create database repository:\n\n 1. In the same directory as the dbRepoConfig.json file, run:\n\n .. code-block::\n\n pgvctrl -mkrepo [repository name]\n\n e.g\n\n .. code-block::\n\n pgvctrl -mkrepo mydb\n\n Output:\n\n .. code-block::\n\n Repository created: mydb\n\n **What just happened?**\\ \n\n - There will be a folder structure: [my dir]/databases/[repository\n name]/ created.\n - The dbRepoConfig.json file will be updated to reflect the new\n repository.\n\n#. Initialize database repository:\n\n 1. In the same directory as the dbRepoConfig.json file, run:\n\n .. code-block::\n\n pgvctrl -init [db connection information] -repo [repository name]\n\n For production databases:\n\n .. code-block::\n\n pgvctrl -init [db connection information] -repo [repository name] -production\n\n **NOTE:**\\ **Database connection information should include at a\n minimum.**\n\n *Standard Information*\n\n .. code-block::\n\n -d [database name on server]\n\n e.g.\n\n .. code-block::\n\n pgvctrl -init -d mylocaldb -repo mydb\n\n Other information as needed:\n\n .. code-block::\n\n -host [postgres server host]\n -p [port]\n -u [database username]\n -pwd [password]\n\n *Or*\n\n *Service\n Information*\\ `.pg_service `__\n\n .. code-block::\n\n -svc [pg service information]\n\n e.g.\n\n .. code-block::\n\n pgvctrl -svc mydatabase:test -repo mydb\n\n **What just happened?**\\ After initialization is complete:\n\n - There will be a new table in your database named\n repository_version. This is where pgvctrl stores your repository\n name, version number with a version hash for each sql update file,\n environment name, revision (number of times the same version has\n been applied with different sql hash) and production flag.\n\n#. Make repository version for repository: -mkv: Make version number:\n\n .. code-block::\n\n pgvctrl -mkv [x.x.x.version_name] -repo [repository name]\n\n e.g.:\n\n .. code-block::\n\n pgvctrl -mkv 1.0.0.my_new_version -repo mydb\n\n Output:\n\n .. code-block::\n\n Version mydb/1.0.0.my_new_version created.\n\n#. Create sql change files in the versioned directory! These files will\n be used to update your database and should have the naming convention\n of: [order number].[change name].sql e.g.: 100.AddedUserTable.sql\n\n **Notes:**\n\n * For best results with sql files, wrap all statements in a Transactions.\n\n .. code-block::\n\n BEGIN TRANSACTION;\n [Your sql changes] \n COMMIT;\n\n#. List repositories and changes:\n\n .. code-block::\n\n pgvctrl -rl\n\n Output:\n\n .. code-block::\n\n mydb\n v 1.0.0.my_new_version\n\n Verbose:\n\n .. code-block::\n\n pgvctrl -rlv\n\n Output:\n\n .. code-block::\n\n mydb\n v 0.0.0.my_new_version\n 100 AddUsersTable\n\n\n#. List repository Schema Snapshots:\n\n .. code-block::\n\n pgvctrl -lss\n or\n pgvctrl -list-schema-snapshots\n\n Output:\n\n .. code-block::\n\n mydb\n 1.0.0.my_new_version 5.21 KB\n\n#. List repository database dumps:\n\n .. code-block::\n\n pgvctrl -ldd\n or\n pgvctrl -list-database-dumps\n\n Output:\n\n .. code-block::\n\n mydb\n mydb.test.20190101 132.22 MB\n\n\n#. When you are ready to apply your changes to your database:\n\n .. code-block::\n\n pgvctrl -apply -v [version number] -repo [repository name] [db connection information]\n\n e.g.\n\n .. code-block::\n\n pgvctrl -apply -v 0.0.0 -repo mydb -d mylocaldb\n\n Output:\n\n .. code-block::\n\n Running: 100.AddUsersTable\n ...\n Running: 500.AddStatesTable\n\n **Notes:**\n\n - If you are applying changes to a production database, you must use\n the -production flag.\n\n **What just happened?**\n\n - All of the sql files with [number].[change name].sql were ran\n against your database.\n - The repository_version table was update with the new version hash.\n\nSQL Error handling\n~~~~~~~~~~~~~~~~~~\n\nSQL Error handling on -apply In the event of an SQL error, pgvctrl will attempt to run the rollback version of your sql.\n\ne.g\n\n.. code-block::\n\n\n 100.AddUsers.sql\n 100.AddUsers_rollback.sql - rollback file for 100.AddUsers.sql\n\n- If your rollback file does not exist or fails, the -apply command fails and no sql after the first failing sql file will be ran.\n- If the rollback file succeeds, all other sql files will be ran until all files have been applied if they can be.\n\nWorking with environments:\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSetting up environment versions in repositories help ensure versions get\ndeployed to the proper database.\n\nMaking and setting environments.\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n-mkenv: Make environment type:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -mkenv [env_name] -repo [repository name]\n\ne.g.:\n\n.. code-block::\n\n pgvctrl -mkenv test -repo mydb\n\nOutput:\n\n.. code-block::\n\n Repository environment created: mydb test\n\n-setenv: Set environment type to a version:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -setenv [env_name] -v [x.x] -repo [repository name]\n\ne.g.:\n\n.. code-block::\n\n pgvctrl -setenv test -v 1.0.0 -repo mydb\n\nOutput:\n\n.. code-block::\n\n Repository environment set: mydb test 1.0.0\n\n-init database with environment:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -init [db connection information] -repo [repository name] -setenv [env_name]\n\nFor production databases:\n\n.. code-block::\n\n pgvctrl -init [db connection information] -repo [repository name] -setenv [env_name] -production\n\nOutput:\n\n.. code-block::\n\n Database initialized environment [env_name]\n\n-apply using -env:\n~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -apply -env [env_name] -repo [repository name] [db connection information]\n\ne.g.\n\n.. code-block::\n\n pgvctrl -apply -env test -repo mydb -d mylocaldb\n\nOutput:\n\n.. code-block::\n\n Running: 100.AddUsersTable\n ...\n Running: 500.AddStatesTable\n Applied: mydb v 1.1.0.MyVersion.0\n\nWhat else can pgvctrl do?\n-------------------------\n\n-chkver: Check the version and repo on a database:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -chkver -repo [repository name] [db connection information]\n\ne.g:\n\n.. code-block::\n\n pgvctrl -chkver -repo mydb -d mylocaldb\n\nOutput:\n\n.. code-block::\n\n mydb: 0.0.0.first.0\n\n-status: Check database repository version status:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -status -repo [repository name] [db connection information]\n\ne.g:\n\n.. code-block::\n\n pgvctrl -status -repo mydb -d mylocaldb\n\nOutput:\n\n.. code-block::\n\n mydb\n v 0.0.0.first ['test']\n Applied 100.some_sql\n Not Applied 200.some_sql\n Different 300.some_sql\n Missing 400.some_sql\n\n- Applied (whitish) - The sql file has been applied to the database.\n- Not Applied (green)- The sql file has not yet been applied to the database.\n- Different (orange) - The sql file has been applied to the database, but the file has been altered/updated.\n- Missing (red) - The file had been applied to the database, but was removed from the version.\n\n-timer-on/-timer-off: Turn executions timer on/off for -apply, -applyss, -pulldata, -pushdata, -dump and -restore:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -timer-on\n\nOutput:\n\n.. code-block::\n\n Execution Timer ON\n\n.. code-block::\n\n pgvctrl -timer-off\n\nOutput:\n\n.. code-block::\n\n Execution Timer OFF\n\n\n**What happens?**\\\n\n- The \"timeExecutions\" value in dbRepoConfig.json is toggled\n\n-rmenv: Remove environment type:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -rmenv [env_name] -repo [repository name]\n\ne.g.:\n\n.. code-block::\n\n pgvctrl -rmenv test -repo mydb\n\nOutput:\n\n.. code-block::\n\n Repository environment removed: mydb test\n\n-rmrepo: Remove Repository\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block::\n\n pgvctrl -rmrepo [repository name]\n\ne.g.:\n\n.. code-block::\n\n pgvctrl -rmrepo test\n\nOutput:\n\n.. code-block::\n\n Repository removed: test\n\n**Notes:**\\\n\n* If this command does not remove the folder from database, you must remove it and its contents yourself. This is a safety measure.\n* Any repository folders left behind will be displayed as UNREGISTERED when the -rl option is used.\n\nManage schemas and tables in Schema Snapshots\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nManage schemas (\u2013schema, \u2013exclude-schema, \u2013rm-schema, \u2013rm-exclude-schema):\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n#. Allows the user to say what schemas structures to include/exclude\n when Schema Snapshots are created.\n#. The \u2018rm\u2019 arguments allow the user to remove schemas from the included\n and excluded lists.\n\nTo include a schema:\n\n.. code-block::\n\n pgvctrl -n membership -repo pgvctrl_test\n or\n pgvctrl -schema membership -repo pgvctrl_test\n\nOutput:\n\n.. code-block::\n\n Repository added: pgvctrl_test\n include-schemas ['membership']\n\n**What happens?**\\ \n\n- The dbRepoConfig.json file with have the membership schema added to\n the includeSchemas list property of the \u201cpgvctrl_test\u201d repository\n\nManage table (\u2013table, \u2013exclude-table, \u2013rm-table, \u2013rmexclude-table):\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n#. Allows the user to say what tables structures to include/exclude when\n Schema Snapshots are created.\n#. The \u2018rm\u2019 arguments allow the user to remove tables from the included\n and excluded lists.\n\nTo include a table:\n\n.. code-block::\n\n pgvctrl -t membership.user -repo pgvctrl_test\n or\n pgvctrl -table membership.user -repo pgvctrl_test\n\nOutput:\n\n.. code-block::\n\n Repository added: pgvctrl_test\n include-table ['membership.user']\n\n**Notes:**\n\n#. If a table/schema is included and then later excluded, the table/schema is moved from included to exclude and vice versa.\n#. Include table/schema works the same as with pg_dump.\n\nSchema Snapshot (-getss, -applyss)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n**What are Schema Snapshots?**\\ Schema Snapshots are snapshots of the\ndatabase structure (tables, views, functions ect.) at the time the snapshot was taken.\n\n**Notes:**\n\n#. There can be only one per repository version!\n#. The table holding the repository information (repository_version) will be saved as an insert in the Schema Snapshot.\n#. Currently, only the schema is saved with Schema Snapshots.\n#. If there were database schema changes outside of pgvctrl, it will be captured in the Schema Snapshot.\n#. Schema Snapshots should only be applied to empty databases.\n\n-getss: Set version Schema Snapshot\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block::\n\n -getss -repo [repository name] [db connection information]\n\n-applyss or -apply-schema-snapshot: Apply version Schema Snapshot\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block::\n\n -applyss [Schema Snapshot Name] -repo [repository name] [db connection information]\n\nManage data (-pulldata, -pushdata)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThere could be many reason why one would want to manage data:\n\n#. Lookup tables.\n#. Testing data.\n#. Just because your boss wants you too.\n\n-pulldata: Pull data from repository by table\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block::\n\n -pulldata [-dt [table name]] -repo [repository name] [db connection information]\n\ne.g.\n\n.. code-block::\n\n -pulldata -dt error_set -dt membership.user_state -repo mydb -d mylocaldb\n\nOutput:\n\n.. code-block::\n\n \n Pulling: error_set\n Pulling: membership.user_state\n \n\n**What happens?**\\ \n\n- The data folder for the repository is created.\n- One sql file per table is created with the table name was the file\n name.\n- A data.json file is created in data folder as well.\n\n**Notes:**\\ If you are just setting up data pulls for the first time,\nyou can add one or more tables with the [-t [table name]] option.\n\n-pushdata: Push data from repository to database\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nOnce you have your data in your repository, pushing data is easy.\n\n.. code-block::\n\n -pushdata -repo [repository name] [db connection information]\n\ne.g.\u00a0For pushing by table(s).\n\n.. code-block::\n\n -pushdata -dt error_set -dt process_state -repo mydb -d mylocaldb\n\ne.g.\u00a0For pushing all tables.\n\n.. code-block::\n\n -pushdata -repo mydb -d mylocaldb\n\nOutput:\n\n.. code-block::\n\n Pushing Data\n Running: error_set.sql\n\n**Notes:**\nFor interdependent data pushes, create _pre_push.sql and _post_push.sql files in the\ndata folder to have pgvctrl execute before and after the data push.\n\ne.g.\n\n.. code-block::\n\n data/\n _pre_push.sql\n error_set.sql\n membership.user_state.sql\n _post_push.sql\n\n-dump: Dump the repositories database\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nYou can dump the database based on the repository backing it. This means\nincludes/excludes for schemas and tables are honored during the database\nbackup.\n\n.. code-block::\n\n -dump -repo [repository name] [db connection information]\n\ne.g.\u00a0For dumping the database.\n\n.. code-block::\n\n -dump -repo mydb -d mylocaldb\n\nOutput:\n\n.. code-block::\n\n Do you want to dump the database? [YES/NO]\n :[Type YES]\n Repository mydb database backed up\n\n\n**What happens?**\\\n\n- The _databaseBackup/[repository name] folder is created if it doesn't exist.\n- The backup [repository name][.environment].[string date] file is created.\n\n-restore: Restore a repositories database from -dump\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nYou can restore a repositories database based on a previous repository database dump.\n\n.. code-block::\n\n -restore [repository name][.environment].[string date] -repo [repository name] [db connection information]\n\ne.g.\u00a0For dumping the database.\n\n.. code-block::\n\n -restore mylocaldb.test.20190101 -repo mydb -d mylocaldb\n\nOutput:\n\n.. code-block::\n\n Do you want to restore the database? [YES/NO]\n :[Type YES]\n Database mylocaldb.20190101 from repository mydb restored ['-d', 'mylocaldb'].\n\n\n**What happens?**\\\n\n- The _databaseBackup/[repository name]/[dump file] file is used to fill the empty database at [db connection information].\n\n**Notes:**\n\n#. Database for restore should an empty databases.\n\n\ndbRepoConfig.json\n~~~~~~~~~~~~~~~~~\n\nThe dbRepoConfig.json files is the configuration file for your\nrepositories. The defaultVersionStorage object is used to build the table\nthat stores your repository information in the database on\ninitialization. Each repository can be set up with different repository\ntable structures as you see fit. The root setting tells pgvctrl where to\nlook for the repositories.\n\n.. code-block::\n\n {\n \"defaultVersionStorage\": {\n \"env\": \"env\",\n \"isProduction\": \"is_production\",\n \"repository\": \"repository_name\",\n \"revision\": \"revision\",\n \"table\": \"repository_version\",\n \"tableOwner\": null,\n \"version\": \"version\",\n \"versionHash\": \"version_hash\"\n },\n \"dumpDatabaseOptionsDefault\": \"-Fc -Z4\",\n \"repositories\": [\n {\n \"dumpDatabaseOptions\": \"-Fc -Z4\",\n \"envs\": {\n \"your_test\": \"1.0.1\",\n \"your_qa\": \"1.0.0\",\n \"your_prod\": \"0.9.0\"\n },\n \"name\": \"YouRepoName\",\n \"restoreDatabaseOptions\": \"-Fc -j 8\",\n \"versionStorage\": {\n \"env\": \"env\",\n \"isProduction\": \"is_production\",\n \"repository\": \"repository_name\",\n \"revision\": \"revision\",\n \"table\": \"repository_version\",\n \"tableOwner\": null,\n \"version\": \"version\",\n \"versionHash\": \"version_hash\"\n }\n }\n ],\n \"restoreDatabaseOptionsDefault\": \"-Fc -j 8\",\n \"root\": \"databases\",\n \"timeExecutions\": false\n }\n\ndata.json\n~~~~~~~~~\n\nThe data.json file holds the list of tables for pushing and pulling data\nto and from your database. The column-inserts setting tells pgvctrl to\ncreate the table with insert statements if set to true. If false, the\ntable is created with postgres copy. When data is pushed to the\ndatabase, all relationships are dropped and recreated when the copy is\ncomplete.\n\nExample data.json file:\n\n.. code-block::\n\n [\n {\n \"apply-order\": 0,\n \"column-inserts\": true,\n \"table\": \"error_set\"\n },\n {\n \"apply-order\": 0,\n \"column-inserts\": true,\n \"table\": \"membership.user_state\"\n }\n ]\n\nLicense\n-------\n\nThis project is licensed under the MIT License, provided in repository.\n\nAuthors\n-------\n\n- Heath Sutton - *Initial work* - `87th Street Development `_.\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/87thstdev/pgvctrl", "keywords": "postgres version control sql migrate migration patch patches", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pgvctrl", "package_url": "https://pypi.org/project/pgvctrl/", "platform": "", "project_url": "https://pypi.org/project/pgvctrl/", "project_urls": { "Homepage": "https://github.com/87thstdev/pgvctrl" }, "release_url": "https://pypi.org/project/pgvctrl/1.0.1/", "requires_dist": null, "requires_python": "", "summary": "postgreSQL database version control tool", "version": "1.0.1" }, "last_serial": 4862710, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "88ab804a9c741edbd4f3642091dfbd0a", "sha256": "4a58ff50b247a5035919ba58a3f5937267e87dc9fc6e4a077367dd246ef624fe" }, "downloads": -1, "filename": "pgvctrl-0.10.0.tar.gz", "has_sig": false, "md5_digest": "88ab804a9c741edbd4f3642091dfbd0a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38435, "upload_time": "2019-01-18T21:52:11", "url": "https://files.pythonhosted.org/packages/b2/ec/e682cb1d05ba0069144009b533a1c785bf51c93758a6da931046bbaec2ac/pgvctrl-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "874878035f48f13a15c216f2cbfcdec9", "sha256": "6adfaddb97f3392c33b1005a4a724df5af2a71270f85dd7db127d3fd10e5f3fb" }, "downloads": -1, "filename": "pgvctrl-0.11.0.tar.gz", "has_sig": false, "md5_digest": "874878035f48f13a15c216f2cbfcdec9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45817, "upload_time": "2019-02-11T05:52:48", "url": "https://files.pythonhosted.org/packages/33/95/2e0ec1be3cfd8a02e1d59d3a5da49b5a5d887c45b1efce47434068db67e0/pgvctrl-0.11.0.tar.gz" } ], "0.11.1": [ { "comment_text": "", "digests": { "md5": "981616d1109f62955ad368df0aa0487d", "sha256": "21f2d7df441cd5ebbd3ad41543671025ab2516cf307c85d0d8fd5aed7960ce25" }, "downloads": -1, "filename": "pgvctrl-0.11.1.tar.gz", "has_sig": false, "md5_digest": "981616d1109f62955ad368df0aa0487d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45896, "upload_time": "2019-02-12T17:22:55", "url": "https://files.pythonhosted.org/packages/95/dd/5b0c9503cb1c6ba2b9c12437d8f16d6c86f54e276c22bd453a3da0e54824/pgvctrl-0.11.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "5e7e3a3bd62a74f10c5a64d9a53037cf", "sha256": "16941b900995d185aea13f5b8761503b5484c0049a9eb564151a03180e3612c0" }, "downloads": -1, "filename": "pgvctrl-1.0.0.tar.gz", "has_sig": false, "md5_digest": "5e7e3a3bd62a74f10c5a64d9a53037cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45967, "upload_time": "2019-02-25T02:26:22", "url": "https://files.pythonhosted.org/packages/2b/11/d7b0da7d6a3ddd736f11c90ef2ea028f79f4056299dbc1663a47777cc41b/pgvctrl-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "d41d9e885c0eb8bc977f5908c41e4178", "sha256": "0950b7e32592ea5e54b4b9f851e159a5b878905af79745ee698e90ae415bf47f" }, "downloads": -1, "filename": "pgvctrl-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d41d9e885c0eb8bc977f5908c41e4178", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45812, "upload_time": "2019-02-25T03:10:17", "url": "https://files.pythonhosted.org/packages/81/6e/e6ada7a3d710ab4919c309f181457e5f90cb1d09382d9de9311d127eb3e0/pgvctrl-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d41d9e885c0eb8bc977f5908c41e4178", "sha256": "0950b7e32592ea5e54b4b9f851e159a5b878905af79745ee698e90ae415bf47f" }, "downloads": -1, "filename": "pgvctrl-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d41d9e885c0eb8bc977f5908c41e4178", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45812, "upload_time": "2019-02-25T03:10:17", "url": "https://files.pythonhosted.org/packages/81/6e/e6ada7a3d710ab4919c309f181457e5f90cb1d09382d9de9311d127eb3e0/pgvctrl-1.0.1.tar.gz" } ] }